DIX[/qualifiers] filename [/qualifiers] This is a program to dump/display/edit records in all types of files. -You can select records by key value and number (indexed files) or record number (sequential files or relative files). -You can display the record-data in raw format (like OpenVMS DUMP) or interpreted format. For the interpreted mode you need a description. See the help about [DIX/HELP] record format for descriptions. -You can use views to combine multiple records from multiple files to one "record" (See the help about "views") -You can dump/display/edit the record data in four modes. 1. Screen oriented (using SMG) (See help about "modes screen_mode"). 2. Screen oriented (using DECwindows) (See help about "modes DECW_mode"). 3. Dump records to a file (See help about "modes file_mode"). 4. Interactive mode with a powerful scripting language. (See help about "modes interactive_mode"). The program supports INDEXED, RELATIVE, DIRECT ACCESS and SEQUENTIAL files. The program can open multiple files and multiple descriptions per file. A fieldname in a record can contain a pointer to (a key in) another file, and you can follow that link to the other file. Files are opened READ-ONLY, unless you specify /MODIFY or /WRITE. Files can also be opened bypassing RMS (via the /FAST qualifier). You may even open modules in a .TLB or .MLB library If the first character of the command line is not a /, DIX checks if the first parameter (so the start of the line) is (part of) a valid DIX verb. If so line is executed as a DIX command. If there is no match, DIX assumes it is a filename to be displayed/editted in screen mode If you define the symbol DIX_NO_AUTO_COMMAND to Y, DIX will assume the parameter is a filename.
The first parameter is filename to be "DIX"ed. The filename can contain a list of wildcards. If you specify /MULTI_FILE DIX will open all files. If you do not specify /MULTI_FILE and more than one files matches the filename(s), you will be prompted to select one file. Parameter 2..8 are optional and contain the optional record-search parameters. See the help about "Record_searches" The filename can also be specified as a file-id. Format: [device:](n1,n2,n3). The default for Device: is SYS$DISK: So $ DIX (10,20,0) Will open the file with fileid (10,20,0) on the disk specified by SYS$DISK $ DIX mydisk:(10,20,0) Will open the file with fileid (10,20,0) on disk "mydisk" DIX will translate the disk/fileid to a filename, and that filename is used for the determination of the description. If you specify the filename as module@[library] or as [library](module), DIX will read the module "module" from the (.TLB or .MLB) file "library". Both module and library may contain wildcards. If no library is specified, DIX will search SYS$LIBRARY:STARLET.MLB and SYS$LIBRARY:FORSYSDEF.TLB (if present) by default. There are 2 special names for the library name DIX_SYS : The DIX_DES.TLB file DIX_USER : The DIX_DES_USER.TLB file (if present) Parameter can also be a dix interactive command. If the symbol dix_no_auto_command is not set to Y, and the command line does not start with a /, DIX will insert a /command just before the command line. This setting makes the /screen necessary if you want to display a file in smg mode
The following symbols may be handy. 'arch' must be VAX, Alpha or IA64 and dev:[dir] the place where the image of DIX can be found DIX:==$dev:[dir]dix_'arch' !default DIX startup in SMG mode DXW:==$dev:[dir]dix_'arch'/decw !dix startup in DECwindows mode DXI:==$dev:[dir]dix_'arch'/inter !dix startup in interactive mode DXC:==$dev:[dir]dix_'arch'/command !dix startup for one line command DXP:==$dev:[dir]dix_'arch'/plot !dix startup for T4 plotting DXD:==$dev:[dir]dix_'arch'/command dir/fast !dix startup fast directory search (like DFU) DIX also supports a number of symbols, that are checked on startup DIX_DEBUG : Y : All debug classes enabled at level 0 to the file DIX_DEBUG.DBG 0..9 : The same as above, but the level is set to 0..9 Any other value will be parsed, and debug classes, level and output will be set. See the help about INTERACTIVE SET DEBUG DIX_STATISTICS: If defined as Y, DIX will print a line on exit with the elapsed, CPU, bufio, dirio, faults (like ^T) DIX_ENABLE_P2 : If defined as Y, DIX will make use of P2 data (Alpha, IA64). This is still experimental, so you must enable it. DIX_FAKE_ARCH : Override the current architecture (VAX/Alpha/IA64) DIX supports a number of logical names DIX_HELP : May point to the DIX_HELP.HLB file The default place is the same directory as the image DIX_PLOT_SETUP : May point to the dix_plot_setup file. The default name is DIX_PLOT_SETUP and the default is SYS$LOGIN:.SETUP DIX_DES : May point to the system-wide description file. The default name is DIX_DES and the default is same_dir_as_image:.TLB DIX_DES_USER : May point to the user defined description file. The default name is DIX_DES_USER and the default is SYS$LOGIN:.TLB DIX_INI : Set the name for the initialisation file. By default this file is SYS$LOGIN:DIX_INI.INI. You can also specify the file via the /startup qualifier. DIX_DECENT : Set the name of the decent setup file, By default same_dir_as_image:.setup DIX_NO_AUTO_COMMAND : Set this symbol to Y to disable the automatic insertion of /command for command lines starting with a valid dix verb
DIX can operate in 9 modes, 3 are interactive, they let you change the records (if you specified /modify) The interactive modes /SCREEN_ORIENTED : DIX will display data full screen via the SMG routines and lets you look at the record and possibly modify it. /DECW_ORIENTED : DIX will display data full screen via the DECwindows routines and lets you look at the record and possibly modify it. /INTERACTIVE : DIX enter interactive (line) mode. This mode has a powerful scripting language, and can also be used in BATCH. The non-interactive commands /FILE_ORIENTED : DIX will behave like DUMP, no interaction possible /INFO : DIX will display information about the file. /VERIFY : DIX will verify an indexed file /ANALYZE : DIX will analyze an indexed file with lots of info /COMMAND : DIX will take the argument and process it /PLOT : DIX will take the argument and process it as PLOT/T4 'arg' The qualifiers /SCREEN, /DECWINDOW, /FILE, /INTERACTIVE, /INFO /PLOT /VERIFY, /ANALYZE, /COMMAND must be entered just after the DIX verb. Three more major-qualifiers qualifiers can be given /HELP : Display help /DEMO : Display demo pages /VERSION : Display the version, link date of DIX (/ALL for all modules)
DIX/ANALYZE [/DISPLAY=(option,option..)] [/VERBOSE=level] option can be KEY=n : Analyze only key LEVEL=n : Analyze only key level 'n' LEVEL="+n" : Analyze only the top 'n' key levels LEVEL=-n : Analyze only the lowest '-n' levels [NO]DATA : Analyze the data buckets too. Since this can take a lot of time, this is not the default. [NO]SIDR : Display the SIDR records, this is the default [NO]KEYBUCKETS : Display the buckets in the key tree, this is the default OUTPUT=filename : If verbose is >0, the extra output can be redirected to another file. The normal output will be in the file specified with /OUTPUT=filename START=n : Start analysis at bucket 'n' in chain, default=0 (n may be negative, last but 'n' bucket of the chain) END=n : End analysis at bucket 'n' in chain, default is whole chain (n may be negative, last but 'n' bucket of the chain) /VERBOSE=level The verbose qualifier defines the amount of output VERBOSE=0 : Just the normal output, see below VERBOSE=1 : Print out the buckets read VERBOSE=2 : Detail 1 and the bucket header info VERBOSE=3 : Detail 2 and SIDR records and the data records VERBOSE=4 : Detail 3 and the SIDR pointers If VERBOSE>0, the output of the detail option can be redirected to another file. See the OUTPUT= option Examples: $ DIX/ANA/DISP=DATA DUPKEY.IDX Analysis of key 1 !analysis info for key 1 Type STG, flags %X05:Duplicate,Nullkey=%X30 Idx area 2, Level1 area 2, bucketsize 1, Fill 512, Level 1, rootvbn 18 Data area 2, bucketsize 1, Fill 512, VBN 17 Keysize 4, number of keysegments 1, minimum recordsize 9 Segment 1, Position 5, size 4 Level 1 !level 1 (toplevel) for key 1 Start vbn : 18, #records = 1, #buckets 1(1 blocks), 100% contiguous Bytes in : Overhead: 17, Keyvalues: 4, Pointers: 2, Bucket fill: 5% Bytes in keys : 4(compressed), 4(uncompressed) = 100% Analysis of SIDR buckets Start vbn : 17, #buckets 1(1 blocks), 100% contiguous Bytes in : Overhead: 14, Keyvalues: 12, Pointers: 43, Bucket fill: 16% Bytes in keys : 12(compressed), 12(uncompressed) = 100% Records : Keyvalues: 3, RFA's: 7, Deleted: 0 Maximum SIDR length : 3, average 2, max SIDR length for key value:2222 Average key length : 4, Average data length 14 Analysis of key 0 !analysis for key 0 Type STG, flags %X81:Duplicate,Data compress Idx area 1, Level1 area 1, bucketsize 1, Fill 512, Level 1, rootvbn 13 Data area 0, bucketsize 1, Fill 512, VBN 4 Keysize 4, number of keysegments 2, minimum recordsize 4 Segment 1, Position 2, size 2 Segment 2, Position 0, size 2 Level 1 !level 1 (toplevel) for key 0 Start vbn : 13, #records = 1, #buckets 1(1 blocks), 100% contiguous Bytes in : Overhead: 17, Keyvalues: 4, Pointers: 2, Bucket fill: 5% Bytes in keys : 4(compressed), 4(uncompressed) = 100% Analysis of DATA buckets Start vbn : 4, #buckets 1(1 blocks), 100% contiguous Bytes in : Overhead: 14, Keyvalues: 44, Data: 178, Bucket fill: 70% Bytes in keys : 44(compressed), 44(uncompressed) = 100% Bytes in datarecords: compressed 178, Uncompressed 145, = 123% (without primary key) Datarecords : Valid 11, #Deleted 0, #RRV 0 Max data length : 18, Average = 17 Maximum DUP keylen : 1 The contiguousness of the areas are not very significant except for the SIDR and data area. They are determined in the following way. If the next bucket of a bucket is adjacent to the current buffer, 5 is added If the next bucket lies within a bucketsize next to the current buffer, 4 is added If the next bucket lies within 2 bucketsizes next to the current buffer, 3 is added If the next bucket lies within 3 bucketsizes next to the current buffer, 2 is added If the next bucket lies within 4 bucketsizes next to the current buffer, 1 is added If the next bucket lies before the current bucket, 0 is added The total is multiplied by 100 and divided by the 5*(bucketcount-1). This gives a number between 0 and 100. If all buckets are adjacent in ascending order we get 100%.
DIX/COMMAND dix_command Take the command line and execute it. This is a one-line interactive mode Command may be a list of commands via the ;command;command construct Each ; must be preceded by a space, or it could be interpreted as part of a filename
If you specify /DECWINDOW, the program will work full screen using DECwindows, and you can look at the data, and possibly modify it (see /MODIFY qualifier). If you have a description present 1. You can modify fields (if in modify mode) by entering a right arrow, Enter, or any printable character. You are in field modifying mode until you enter an Enter. After you type Enter DIX checks if the typed data is valid for that field(-type) and restores the original value if not. The record will not be updated until you type the DO key. 2. For fields that contain field-names, you can also enter a key_getfields key (default PF1-G) and modify/enter the field value. 3. If you type a key_contdis (default F8) DIX will open a popup-display containing information about the description of the current line, and update it when you move between lines. If you type key_contdis again DIX will remove the display. And lots more, see the help (Default PF2 or Help) on the command line you may set some settings for the DECwindows displays See the help in /attributes. Syntax DIX/DECWINDOW filespec[/qualifiers] [searchparameter] [searchparameter] .. The searchparameter is optional, see the help about [DIX/HELP] record_search Up to 7 (search) parameters are supported. DCL allows 8 parameters, and the first one is the filename.
DIX will enter demo mode, You will be show (some of) the capabilities of DIX.
If you specify /FILE the program will dump the data to a file or the terminal (see /OUTPUT qualifier) in either interpreted or raw dump mode. Syntax DIX/FILE filespec[/qualifiers] [searchparameter] [searchparameter] The searchparameter is optional, see the help about [DIX/HELP] record_search Up to 7 (search) parameters are supported. DCL allows 8 parameters, and the first one is the filename.
Display the DIX help, you are doing it now You can specify arguments for the help. If the first argument is a qualifier you must use "'s around the help text, otherwise DCL will get confused. The following qualifiers are supported for the HELP command, and must be entered directly after the HELP command /DCL : Display the help in SYS$HELP:HELPLIB.HLB instead of the DIX help /DECWINDOW : Display the help in a DECwindow window. This requires the availability of DECwindows and a freeware package FSHELP (see below) Examples: $ DIX/HELP modes ! Give help about the mode $ DIX/HELP modes info ! Give help about the modes info subtopic $ DIX/HELP "/DISPLAY" ! Give help about the /DISPLAY qualifier. You need the quotes here $ DIX/HELP record_sear/exist ! Give help about the /exist subtopic in record_sear $ DIX/HELP/DCL copy ! Give help about the COPY command in SYS$HELP:HELPLIB.HLB $ DIX/HELP/DECW modes ! Give the help about modes in a DECwindows display (if FSHELP is installed) DIX will use the LBR$OUTPUT_HELP routine. If you also have the FSHELP freeware package installed (available on the same website), DIX will use the FSHELP_SHR inclusive a DECwindows interface.
The /INFO qualifier will display information about the file(s), including information about the keys of an indexed file. This information includes name, position, size and type of keys. The /INFO qualifier must be the first on the command line. If you specify the /FDL qualifier also, DIX will output the info in an FDL file. This should give the same output as ANALYZE/RMS/FDL, but is does not analyze the data, so it is a lot faster for large files (but cannot be used for optimizing) Example: $ DIX/INFO SYSUAF Information about file KXSYS_DISK:[VMS_COMMON.SYSEXE]SYSUAF.DAT;2 File Opened for : Normal I/O,Fast I/O(Default) Fast Blocksize : 1024 Fast Multibuffer: 4 Organization : Indexed Lock mode : Normal Record format : Variable Creation date : 25-NOV-2003 17:01:26.28 Expiration date : 5-FEB-2007 08:15:44.15 Backup date : <No backup recorded> Revision date : 9-AUG-2006 08:15:44.15 File id : (66004,27,0) File owner : [SYSTEM] = [1,4] File protection : S:RWED, O:RWED, G:RE, W: Globalbuffercount: 0 Record Record attribute : NONE Max record size : 1412 Longest record : 0 Allocation EOF block : 72 (FFB = 0) Allocated blocks : 72 Bucketsize : 3 Areas Area Allocation bucketsize extension 0 72 3 10 Keyinformation D C I K D N ..INDEX. ..DATA.. Nr Type u h c c c u Lvl Pos Siz Area Bkt Area Bkt Field p g p p p l Nr siz Nr siz 0 STG N N Y Y Y NO 1 4 32 0 3 0 3 UAF$T_USERNAME 1 BIN4 Y Y N N N NO 1 36 4 0 3 0 3 UAF$W_MEM,UAF$W_GRP,UAF $L_UIC 2 BIN8 Y Y N N N NO 1 36 8 0 3 0 3 UAF$W_MEM,UAF$W_GRP,UAF $L_UIC,UAF$L_SUB_ID 3 BIN8 Y Y N N N NO 1 44 8 0 3 0 3 UAF$Q_PARENT_ID(1),UAF$ Q_PARENT_ID(2) * means the current file The tags in the keyinformation are Nr : The key number Type: The key type (Descending keys have D in front) Dup : This key allows duplicate Chg : This key is changeable Icp : Key values are compressed in index buckets Kcp : Key values are compressed in data buckets Dcp : Data values are compressed (in data buckets) Nul : The null-key value (in hexadecimal) for this key or NO Lvl : The tree depth for index buckets Pos : The starting position of the key (multiple lines if more segments) Siz : The size of the key (multiple lines if more segments) Index: Area_nr : The area for the index buckets Bktsize : The bucket size for the index buckets Data: Area_nr : The area for the data buckets Bktsize : The bucket size for the data buckets If DIX has a description for this file (as above) DIX will also display the fields that are part of this key An example of an FDL command $ DIX/info/fdl/out=test.fdl test.dat
If you specify /INTERACTIVE, DIX will enter interactive mode and lets you display/modify fields. This mode works in BATCH too, so you can create command-files and use DIX to display/modify fields. See also the /INTERACTIVE qualifier. ![Interactive mode]DIX /INTERACTIVE Syntax DIX/INTER [@file] [filespec] [/qualifiers] [searchparameter] .. @file maybe a file containing DIX commands. If specified it must be the first parameter. The default filename is [].DIX This file can also be specified via the /script qualifier. Filespec is optional. If you do not specify a filespec DIX will start without any file open. You can then later open/close files with the interactive commands OPEN and CLOSE. Example: $ DIX/INTER @mycommands SYSUAF/MODIFY $ DIX/INTER SYSUAF/MODIFY /script=mycommands Will both execute the commands in mycommands[.DIX] and exit. The searchparameter(s) is/are optional, see the help about [DIX/HELP] record_search Since DCL allows 8 parameters, up to 7, or 6 if @file is present, searchparameters are supported.
If you specify DIX/RESTORE, DIX will continue from the point you exited DIX the last time (if you had auto mode enabled then). It will open all files you had open, and select the record(s) you were processing at that time. It will also restore your recall buffer, key definitions for the interactive mode, display settings and so on. See the SET AUTO, SHOW AUTO, EXIT/[NO]AUTO command in interactive mode.
pipe command [;command [;command]] Make a sequence of commands. You can use loops in this statement i.e. DIX> pipe for k=1,10 ; show symb k ; end for DIX> pipe k=1 ; lp:show symb k ; k=k+1 ; if k <= 10 then goto lp the ; must be preceded by a space or it could be part of a filename This is handled as a new command procedure level. Any symbols defined in the pipe command will be deleted after the pipe is complete. If you want to preserve the symbol, declare it with /level=-1 so DIX> ; int a ; a=10 ; say a !will print 10, and a is deleted and DIX> ; int a/level=-1 ; a=10 ; say a !will print 10, but a is still there You can replace the PIPE verb by a ; so DIX> pipe command ; command ; command will be the same as DIX> ; command ; command ; command
DIX/PLOT filemask/qualifiers DIX will execute the PLOT/T4 'filemask/qualifiers'. For more help see the INTERACTIVE_MODE PLOT command. You can also use the DIX/PLOT/CSV and the DIX/PLOT/PIE command.
If you specify /SCREEN , DIX will work in full screen mode using the SMG routines, and you can look at the data, and possibly modify it (see /MODIFY qualifier). If you have a description present 1. You can modify fields (if in modify mode) by entering a right arrow, Enter, or any printable character. You are in field modifying mode until you enter an Enter. After you type Enter DIX checks if the typed data is valid for that field(-type) and restores the original value if not. The record will not be updated until you type the DO key. 2. For fields that contain field-names, you can also enter a key_getfields key (default PF1-G) and modify/enter the field value through a SMG-menu. 3. If you type a key_contdis (default F8) DIX will open a popup-display containing information about the description of the current line, and update it when you move between lines. If you type key_contdis again DIX will remove the display. And lots more, see the help (Default PF2 or Help) Syntax DIX[/SCREEN] filespec[/qualifiers] [searchparameter] [searchparameter] .. The searchparameter is optional, see the help about [DIX/HELP] record_search Up to 7 (search) parameters are supported. DCL allows 8 parameters, and the first one is the filename.
DIX/verify indexedfile [qualifiers] Check all buckets of an indexed file for corruption. Supported qualifiers are /verbose=n : n=0..4 Output more info during the check /output=filename : Print errors to file DIX can be used to detect and repair corrupt indexed files See the deeper help BE VERY CAREFUL. =============== Always make a copy of the corrupt file and edit the copied file.
If a file has a corrupt bucket, You may use DIX to repair the file or get as many records out of it as possible. If the bucket is not a data bucket, DIX using Fast I/O can read all records and copy them to a new file. Example: We have a file with a corrupt index bucket (it was patched) $ DIX/info/verify sysu.dat/verbose=3 Information about file USER50:[STUBBF.PROGRAMS.DIX.TEST]SYSU.DAT;2 ... Reading Prologue block 1 Checking area 0 Reading area admin offset 0 in block 3 Checking area fields 0 Checking key 0 Reading key admin block offset 0 in block 1 Checking key fields for key 0 Checking key tree for key 0 %DIX_RMS-W,Bucket 7 level 1 Check bytes different, first 0A, last 0E, previous bucket 0 Checking key 1 Reading key admin block offset 0 in block 2 Checking key fields for key 1 Checking key tree for key 1 Checking key 2 Reading key admin block offset 102 in block 2 Checking key fields for key 2 Checking key tree for key 2 Checking key 3 Reading key admin block offset 204 in block 2 Checking key fields for key 3 Checking key tree for key 3 This tells us that a bucket is corrupt in the primary key chain at level 1. Since this is NOT a data bucket we can use DIX to get all records from this file and copy it to a new file using $ DIX/interactive sysu.dat %RMS-F-CHK, bucket format check failed for VBN = 7 %DIX-I-USINGFIL, Using file USER50:[STUBBF.PROGRAMS.DIX.TEST]SYSU.DAT;2/NOMOD DIX (RMS) is telling us that the file has a corrupt bucket (the root bucket for the primary key. RMS cannot process this file, so we try again using Fast I/O $ DIX/interactive sysu.dat/fastio %DIX-I-USINGFIL, Using file USER50:[STUBBF.PROGRAMS.DIX]SYSU.DAT;2/NOMOD DIX> WRITE/ALL/LOG new_file.dat %DIX-I-RECAPP, 62 records written to NEW_FILE.DAT So now we have a copy of the file with all record. Now use convert to make the file indexed again, and we have all records back If the corrupt bucket IS a data bucket you have two options. 1. Use DIX to repair the corrupt bucket. 2. Use DIX to skip the data bucket.
Now suppose the corrupt bucket is the in one of the data buckets. RMS as well as Fast I/O will follow the chain of the data-buckets and will find the corrupt bucket, so we cannot use the previous method. Below is the technique to repair a DATA-bucket (if not too heavily damaged) $ DIX/interactive [.test]sysu.dat %DIX-I-USINGFIL, Using file USER50:[STUBBF.PROGRAMS.DIX]SYSU.DAT;2/NOMOD DIX> ne DIX> ne %RMS-F-CHK, bucket format check failed for VBN = 55 %RMS-F-CHK, bucket format check failed for VBN = 0 This tells us we have a corrupt bucket at bucket 55. We need to know the bucketsize of the data-buckets $ DIX/info sysu.dat !show key info of the file Keyinformation ..... D C I K D N ..INDEX. ..DATA.. Nr Type u h c c c u Lvl Pos Siz Area Bkt Area Bkt p g p p p l Nr siz Nr siz 0 STG N N Y Y Y NO 1 4 32 0 3 0 3 <== this 3 is the data bucketsize ... Enter DIX in block mode for this bucket (using the built-in $BUCKET description) $ DIX/INT/MODIFY /BLOCK=3/record=55/descr=$bucket SYSU.DAT %DIX-I-USINGFIL, Using file USER50:[STUBBF.PROGRAMS.DIX]SYSU.DAT;2/MOD %DIX-I-MESSAGE, "Data bucket" %DIX-I-MESSAGE, "Check and Check1 not equal, corrupt bucket" %DIX-I-USINGDES, Using description DSA50:[STUBBF.PROGRAMS.DIX]DIX_DES.TLB;135($BUCKET) DIX> !DIX tells us the bucket is corrupt (the check and check1 are unequal) DIX> examine *CHECK* 0.0|CHECK |19 2.0|CHECK_VBN|55 1535.0|CHECK1 |17 And indeed : check and check1 are not equal. We can patch them to be equal DIX> DEPOSIT CHECK=17 %DIX-I-MESSAGE, "Data bucket" !DIX tells us it is data bucket DIX> UPDATE If this was the only problem, the bucket is now correct. You may test to see if the rest of the buckets looks OK DIX> EXAMINE If this looks fine, all is done. If not we need to skip this data bucket from the data-bucket chain, so see the other help (skipping bucket)
Now the bucket is very corrupt and does not contain any valid data. We can use DIX to skip the bucket from the data-chain. This means we use a bucketful of records, not perfect but better than nothing at all. $ DIX/info/verify sysu.dat Information about file USER50:[STUBBF.PROGRAMS.DIX.TEST]SYSU.DAT;2 %DIX-E-VERIFY, Bucket 55, level 0 Check bytes different, first 13, last 11, previous bucket 4 %DIX-E-VERIFY, Data bucket 55 points to bucket 33,but the upper key bucket points to 34 %DIX-S-VERIFY, Using pointer from index bucket 7 to bucket 34 %DIX-E-ERRSEEN, Error seen during verify So bucket 55 has two problems 1. The check bytes do not match 2. The next_bucket pointer (33) is probably incorrect, since the above lying index buckets points to bucket 34, and this index bucket seems to be valid. The previous bucket of 55 is 4, so now we need to patch bucket 4 to point to bucket 34, effectively skipping bucket 55. We still know the bucket size for data=3 $ DIX/INT/MODIFY /BLOCK=3/record=4/descr=$bucket SYSU.DAT %DIX-I-USINGFIL, Using file USER50:[STUBBF.PROGRAMS.DIX.TEST]SYSU.DAT;2/MOD %DIX-I-MESSAGE, "Data bucket" %DIX-I-USINGDES, Using description DSA50:[STUBBF.PROGRAMS.DIX]DIX_DES.TLB;135($BUCKET) DIX> examine next_bucket 8.0|NEXT_BUCKET>|55 Indeed bucket 4 points to bucket 55, we now set its forward to bucket 34 DIX> deposit next_bucket=34 DIX> UPDATE DIX> REWIND DIX> WRITE/ALL/LOG x.x %DIX-I-RECAPP, 58 records written to x.x Now we have copied all (58 and not 62) records to x.x, and recovered most of the records
DIX/VERSION [/ALL][/SYMBOL] [/OUTPUT=file] Display the version and link date of DIX. If /ALL is specified, versions and creation dates of all DIX modules will be displayed. If /SYMBOL is specified DIX will define the following symbols DIX_VERSION : Containing the version e.g. "7.1" DIX_LINK_DATE : Containing the link date e.g. "23-AUG-2008 10:12.19.45" If /ALL is also specified, DIX will also define the following symbols DIX_MODULE_COUNT : Count of modules DIX_MODULE_NAME_'n' : The name of the module 'n' DIX_MODULE_DATE_'n' : The creation date of the module 'n' with n=1..dix_module_count
The following file types are supported.
For SEQUENTIAL or RELATIVE files the record selection is based on the /RECORD qualifier. If the start record is nn, the first nn-1 records will be skipped, this may take some time. If the record format is fixed, DIX can read the record directly without skipping the previous records.
/RECORD=nr You can specify the starting record number. For indexed files you can also use the /key to go to the 'n'th record on key 'key'. If not specified the program starts at the first record.
You can specify a record number. DIX will rewind the file and skip 'recordnumber'-1 records. You can also specify a cell number with the /EQ, /GE, /GT In this case the access will be direct.
/RECORD=nr You can specify the starting record number.
/EQ=value Look for a record with a cell number EQ the specified value. The values will be converted by DCL to uppercase, unless enclosed in quotes. See also the help about keyvalues. If DIX is in case_sensitive mode, DIX will not uppercase the value. See the help about "set case "
/GE=value Look for a record with a cell number GE the specified value. The values will be converted by DCL to uppercase, unless enclosed in quotes. See also the help about keyvalues. If DIX is in case_sensitive mode, DIX will not uppercase the value. See the help about "set case "
/GT=value Look for a record with a cell number GT the specified value. The values will be converted by DCL to uppercase, unless enclosed in quotes. See also the help about keyvalues. If DIX is in case_sensitive mode, DIX will not uppercase the value. See the help about "set case "
When specifying a record number or a cell number with the /record,/eq,/ge,/gt DIX will convert the text to a number.
For INDEXED files the record selection is based on the /EQ or /GE or /GT or /LE or /LT and the /KEY qualifier. If the key has Ascending attributes, the /EQ, /GE or /GT qualifiers must be used, and if the key is descending, the /EQ, /LE or /LT qualifiers. Information about the key types can be obtained via the /INFO qualifier.
/RECORD=nr You can specify the starting record number. You can also use the /key to go to the 'n'th record on key 'key'.
/KEY=nr Look for the keyvalue on the specified key. The default is the primary key (0). If none of the LT, LE, EQ, GE, GT options is specified, the program will start with the first record on the specified key.
/LT=value Look for a record with keyvalue LT the specified value. Information about the key types can be obtained via the /INFO qualifier. The values will be converted by DCL to uppercase, unless enclosed in quotes. See also the help about keyvalues. If DIX is in case_sensitive mode, DIX will not uppercase the value. See the help about "set case "
/LE=value Look for a record with keyvalue LE the specified value. Information about the key types can be obtained via the /INFO qualifier. The values will be converted by DCL to uppercase, unless enclosed in quotes. See also the help about keyvalues. If DIX is in case_sensitive mode, DIX will not uppercase the value. See the help about "set case "
/EQ=value Look for a record with keyvalue EQ the specified value. The values will be converted by DCL to uppercase, unless enclosed in quotes. See also the help about keyvalues. If DIX is in case_sensitive mode, DIX will not uppercase the value. See the help about "set case "
/GE=value Look for a record with keyvalue GE the specified value. Information about the key types can be obtained via the /INFO qualifier. The values will be converted by DCL to uppercase, unless enclosed in quotes. See also the help about keyvalues. If DIX is in case_sensitive mode, DIX will not uppercase the value. See the help about "set case "
/GT=value Look for a record with keyvalue GT the specified value. Information about the key types can be obtained via the /INFO qualifier. The values will be converted by DCL to uppercase, unless enclosed in quotes. See also the help about keyvalues. If DIX is in case_sensitive mode, DIX will not uppercase the value. See the help about "set case "
When specifying a keyvalue with /lt, /le, /eq, /ge, /gt the program will check for the key type (in the file). For binary key types the program will convert the data from ASCII to binary. For string types you can enter binary values via the %DD syntax where DD are hexadecimal digits (%% will enter one %). See the conversion options below
INT2 values can only be specified as integers.
INT4 values can be specified in 3 ways 1. A normal integer. 2. A number with another radix in two formats 'DDDD'F with F : X (hexadecimal), O(octal), D(decimal), B(binary) or Rn[n] or %Fddddd with F : X (hexadecimal), O(octal), D(decimal) or B(binary) 3. A Date which will be converted to DATE*4 format. 4. A OpenVMS Identifier 5. A UIC e.g. [SYSTEM] 6. An ASCII string "ABCD"
INT8 keyvalues can be specified in 3 ways 1. One big integer up to 18 characters 2. Two INT4 values separated by a . (e.g. 10.20, see INT4 conversion) (e.g. SYSTEM.1-jan-1991) 3. A date string (e.g. 1-apr-1991).
A VFC file is a sequential file with a fixed prefix. You will normally see this type of file from the DCL OPEN statement. This will generate a VFC file with a 2 byte header, that is used for carriage control. But you can also create your own VFC file with other sizes (up to 255) for other meanings. DIX will display the data from the normal record in one window, and the VFC data in another (in screen mode), or lets you display the data via EXAMINE/VFC (in interactive mode). The file mode can also display the data when you specify /DISPLAY=(all) or /DISPLAY=VFC (see the help about [DIX/HELP] "/DISPLAY") The DEPOSIT/VFC will change data in VFC buffer (in interactive mode) and the PF1-Y command switches from normal data to VFC data in screen mode.
DIX can work either in RAW dump format or INTERPRETED (see the /DESCRIPTION qualifier).
In the RAW dump mode the dump is equal to the OpenVMS DUMP format. It is used if no description file can be found, or if the /RAW qualifier is specified. The display is split into two parts. The left part is the data (byte, word, longword) in decimal or hexadecimal. The right part is the data in ASCII (if printable). In RAW dump mode the following qualifiers can be used.
The data will be dumped in bytes. See also the /WORD and /LONG and /UNSIGNED qualifiers.
The data will be dumped in words. See also the /BYTE and /LONG and /UNSIGNED qualifiers.
The data will be dumped in longwords. See also the /BYTE and /WORD and /UNSIGNED qualifiers. This is the default.
The data (if not in /HEX mode) will be interpreted as unsigned.
Display the data in hexadecimal (Default). See also the /BINARY,/OCTAL,/DECIMAL qualifiers.
Display the data in decimal. See also the /HEX,/BINARY,/OCTAL qualifiers.
Display the data in octal. See also the /HEX,/BINARY,/DECIMAL qualifiers.
Display the data in binary. See also the /HEX,/OCTAL,/DECIMAL qualifiers.
In the interpreted mode, the program will try to display the fields of a record. This mode requires a description file (see the /DESCRIPTION) This is the default if a description can be found. Descriptions can be in files (default 'filename'.DES) or a text library. DIX will look for a description file in the same directory as the data file DIX will look for a file in the current directory. DIX will look for a module in the DIX_DES.TLB file (system_library) (see the help for the [DIX/HELP] "/SYSTEM_LIBRARY" qualifier) DIX will look for a module in the DIX_DES_USER.TLB file (user_library) (see the help for the [DIX/HELP] "/USER_LIBRARY" qualifier) For details see /DESCRIPTION. If no description can be found (and you did not specify /NODES), DIX will load a default description union map bytearr*(32765) $bytes end map map character*32765 $line end map map character $chars(32765) end map end union You can reference (part of) these fields, but DIX will not display the fields with the examine command or screen mode display DIX> say Examine ! Will display in raw mode DIX> Say $line ! Will display the field $line DIX> say $line{10:20} ! Will display elements 10:20 of $line
If the /ALL is given, all matching descriptions will be used. If /ALL is not given, only the first match will be used. The search order is 1. The .DES file in the same directory as the datafile 2. The .DES file in the current directory 3. Entries in user_library (if present) 4. Entries in system_library (if present)
/DESCRIPTION[=name[,name]] Give the name of a record description file(s) or module. The format of description file/module is described in the RECORD_FORMAT help. If the /DESCRIPTION qualifier is given without the filename, the program will look for a file with a filename as the input file, but with the extension .DES. DIX also searches the Text library DIX_DES (with default file "IMAGE_DIRECTORY".TLB), so the text library will be searched in the same directory as the DIX image (but you can redefine the logical name DIX_DES to any text library) for a module with the name that matches the filename of the datafile. A match can be on device, directory, name and extension. This key may define multiple fields separated by a |. If there are multiple field, any field may match. DIX also supports a user defined library. DIX searches for the file DIX_DES_USER with default SYS$LOGIN:.TLB. Normally DIX will stop as soon as a match is found, but if /ALL is given all matching descriptions will be used. Example: DIX MYDEV:[MYDIR]MYDATA.MYEXTENSION [/DES] 1. DIX searches in the current directory for the file MYDATA.DES 2. DIX searches for a description file MYDEV:[MYDIR]MYDATA.DES 3. DIX searches DIX_DES_USER.TLB for a module that matches the name MYDEV:[MYDIR]MYDATE.MYEXTENSION. Empty parts of the module name match. So a module with the name *MY*, .MYEXTENSION, *:[*]*.* will all match. 4. DIX searches DIX_DES.TLB for a module that matches the name MYDEV:[MYDIR]MYDATE.MYEXTENSION. Empty parts of the module name match. So a module with the name *MY*, .MYEXTENSION, *:[*]*.* will all match. The first or all (/ALL specified) matches will be loaded and can be used. Example for multiple fields: Suppose the key is ".BCK|.SAV". This description will match files *.BCK and *.SAV. To insert a module in one of the text libraries you can i.e. use : $ LIBRARY/REPLACE DIX_DES.TLB backupdes.txt/MODULE=".BCK|.SAV"
DIX can use Views. A View is a way to connect multiple records in multiple files to a single entity. With DIX you can display and modify the accumulated data as one record. A view is a module in the DIX_DES.TLB file (or a text file) that contains instructions to build the record from the various records in various files. The name of the module is "VIEW#view_name". The syntax of "view_name" is the same as that of the description records. In the examples is a view for a directory entry. The description has the module name ".DIR" and the view has the module name "VIEW#.DIR" If you use a file, the default file type is ".VIEW". You can open a file with a view. Is this view you can select fields from this (first) file (FIELD statement), and you can ask DIX to follow links to other records in the same or other files (the FOLLOW/BACK statement). In order to use a file in a view, it should have a description, since views reference fieldnames via the FIELD statement, but if you do not have a description you can still use the RANGE command. If you start DIX, you may specify the /VIEW[=namemask] after the file you want to "DIX". You can also use the /follow qualifier to create a simple "follow all" view. See the help about /follow DIX does support modification of views, but only in a limited way. The fields that may be modified must have all of the following a. Be fixed AND b. Not change the link to another file/record This restriction may be lifted in a future release.
Below are some examples of views.
The following example is the view for a directory entry, and all of the file headers up to the [000000] directory. The view will only display the name fields in the file headers. field verslim !examine the version limit field name !examine the name follow v(1).fileid !follow the link to the file header !of the file loop !loop field *_filename !examine the name in ODS-5 part field fnam !and in ODS-2 part test (file_id <> backl_fid) !stop if fid=backl_fid follow backl_fid !follow link to parent end loop !end of loop The file header for the 000000.DIR directory has a fid of (4,4,0) and a back_link (to its parent directory) of (4,4,0) too. We assume the VIEW#.DIR module in the DIX_DES.TLB file exists and contains the above lines. $ DIX/FILE/COUNT=1 ALPHA.dir/view %Info:Recordnumber = 1 , Recordsize = 84 , RFA=(1,0) 0|VERSLIM|none !from the directory entry 2|NAME |DIX_AUTOSAVE_LIBRARY.OBJ !from the directory entry 27|FNAM |DIX_AUTOSAVE_LIBRARY !file header of the .obj file 47|FNAM |ALPHA.DIR;1 !file header of its directory 67|FNAM |DIX.DIR;1 !" " " " 87|FNAM |PROGRAMS.DIR;1 !" " " " 107|FNAM |STUBBF.DIR;1 !" " " " 127|FNAM |000000.DIR;1 !File header of the 000000.dir file
An example for a set of three files that make a simple cross reference system: The first file (CROSS_REF.CRF_FILE_NAMES) has the following description (.CRF_FILE_NAMES in the system or user text library) integer*2 file_nr !primary key character*60 file_name The second file (CROSS_REF.CRF_MOD_NAMES) has the following description (.CRF_MOD_NAMES in the system or user text library) integer*2 mod_nr !primary key character*32 mod_name integer*2 file_nr/file=.CRF_FILE_NAMES !link to the filename The third file (CROSS_REF.CRF_CROSS) has the following description (.CRF_CROSS in the system or user text library) integer*2 caller_nr /file=.CRF_MOD_NAMES !link to module name integer*2 called_nr /file=.CRF_MOD_NAMES !link to module name We can define a view for the .CRF_CROSS file (either in i.e. the cross_ref.view file or in the VIEW#.CRF_CROSS module in DIX_DEF.TLB) (We assume that above named descriptions are in the DIX_DES.TLB file) $ DIX/file/count=1 cross_rec.crf_cross/view field caller_nr !examine the value of caller_nr follow caller_nr !follow the link to .CRF_MOD_NAMES gosub do_common !common code for caller_nr and called_nr field called_nr !examine called_nr follow called_nr !follow the link gosub do_common !common code exit !all done do_common: field mod_name !examine the name of the module follow file_nr !follow the link to the filename in .crf_file field file_name !examine the filename back !pop back to the .CRF_MOD_NAMES back !pop back to the .CRF_CROSS return The result will be something like %Info:Recordnumber = 1 , Recordsize = 4 , RFA=(4,1) 0|CALLER_NR|1 !from the CROSS.CRF_CROSS file 2|MOD_NAME |DIX !from the .MOD_NAMES file 34|FILE_NAME|DIX_MAIN.FOR !from the .FILE_NAMES file 94|CALLED_NR|2 !from the CROSS.CRF_CROSS file 96|MOD_NAME |DIX_MAIN !from the .MOD_NAMES file 128|FILE_NAME|DIX_MAIN.FOR !from the .FILE_NAMES file Another example for the command line /follow qualifier $ DIX/file/count=1 cross_rec.crf_cross/follow=(end,skip) %Info:Recordnumber = 1 , Recordsize = 4 , RFA=(4,1) 0|CALLER_NR|1 2|CALLED_NR|2 4|MOD_NAME |DIX 36|FILE_NR |1 38|FILE_NAME|DIX_MAIN.FOR 98|MOD_NAME_|DIX_MAIN 130|FILE_NR_1|1 132|FILE_NAME|DIX_MAIN.FOR the /follow=(end,skip) means : First display all fields of the record and then follow all links in a record and skip key fields So the display is created as: 1: display the fields in .CRF_CROSS (CALLER_NR and CALLED_NR) 2: Follow the link in CALLER_NR to the .CRF_MOD_NAMES file 3: Display the fields in .crf_mod_name record with mod_nr=1 (we do not display the MOD_NR field since the skipkey is given) 4: Follow the link in FILE_NR to the .CRF_FILE_NAMES 5: Display the fields in .CRF_FILE_NAMES record with FILE_NR=1 (we do not display the FILE_NR field since the skipkey is given) 7: Follow the link in CALLED_NR to the .CRF_MOD_NAMES file 8: Display the fields in .crf_mod_name record with mod_nr=1 (we do not display the MOD_NR field since the skipkey is given) 9: Follow the link in FILE_NR to the .CRF_FILE_NAMES 10: Display the fields in .CRF_FILE_NAMES record with FILE_NR=1 (we do not display the FILE_NR field since the skipkey is given)
A view file/module is a text file. It may contain the following statements - All the control command from interactive mode (if/loop/while/case...) including the gosub/return but not the @ or CALL statements. - FOLLOW Statement to follow the link to another file - BACK Statement to return to the previous file (level) - FIELD To include fields. - RANGE To include a range of bytes (can be useful if you have no description) - OPEN To open files used to follow the fields. The open is only needed if you need to specify file open options others than the default options from the follow command (i.e. the description) - ECHO To display comments to the terminal while expanding - EXIT Statement to exit - symbol assignments For all the statements (except the FIELD and RANGE) the help can be found in the help about interactive mode. See also the examples
If you want to use the FIELD command, the file must have a description FIELD[/follow=follow_type][/skipkey][/readonly][/new_name=name] - [/quiet] fieldnamemask The qualifiers have the following meaning /readonly : Declares the field readonly (if the field is not yet readonly). /follow=type : Let DIX automatically follow all link fields type can be begin : First display the followed fields (and follow them) and then the normal fields end : First display the normal fields and then the followed fields (and follow them) field : Display the followed fields and follow the link immediately. /skipkey : If /follow is used, this will suppress the keyfields of the followed field, since they will already be displayed in the current field /new_name=name : You may override the original name. If the new_name ends with a . ,the original name is appended to the new_name /quiet : If mask does not match any field, DIX will signal a message If you specify /quiet, DIX will not complain For an example see the help for the /follow qualifier The qualifiers must be specified before the fieldnamemask. Fieldnamemask is a wildcard mask to select fields of the current description
The RANGE command may be used whether or not the file has a description RANGE[/READONLY][/quiet][/name=name] bpos:[epos] !epos is default equal to bpos /readonly : Set the field to readonly (if the file is not yet readonly). /quiet : If mask does not match any field, DIX will signal a message If you specify /quiet, DIX will not complain /name=name : Set the name (default=B_'BPOS'_'EPOS') /type=fieldtype : Set the fieldtype (default is BYTEARR) Include bytes bpos up to and including epos If you do not specify epos, DIX will take the default size for the selected fieldtype. If you do specify epos, the size (epos-bpos+1) must be valid for the selected type so "RANGE /type=integer 0:9" will be invalid, since INTEGER*10 is not supported. and "RANGE /TYPE=INTEGER 12" will insert an INTEGER*4 (the default)
Originally DIX_DES.TLB and DIX_DES_USER.TLB were designed to store record definitions (descriptions). In a later phase VIEWS were added. To discriminate between views and normal definitions the module names of the views (in the .TLB) files are preceded by VIEW#. So a view with a name .DIR is stored in the .TLB file with a key VIEW#.DIR and the record definition for the same file with key .DIR. Later the same technique was used to store DEMO files (DEMO#...) Since DIX 8.3 DIX can look up a lot of things in .TLB files so this concept has been enhanced. Now the following types of data can be stored in .TLBs Suppose the name of the object is MYNAME Prefix Type None The normal record definitions VIEW# The view descriptions to be used via the /VIEW=MYNAME DEMO# The DEMO files to be called in the DIX/DEMO mode FUNC# Function definitions to be used via the LOAD/FUNC MYNAME PARM# Parameter definitions to be used via LOAD /MODULE=MYNAME PROC# Command scripts to be called like @MYNAME@ STRU# Structure definitions to be used via load/structure MYNAME You can store the definitions yourself via the (example for parameter file) $ LIBRARY/INSERT DIX_DES_USER.TLB myparam.txt/module="PARM#MYPARAMS" and then use if via the DIX> LOAD /modu=MYPARAMS !DIX will search SYS$LIBRARY:STARLET.MLB !and SYS$LIBRARY:FORSYSDEF.TLB (if is exists) ! for the module MYNAME !and DIX_DES_USER (the user des file, if it exists) !and DIX_DES, the normal description file ! for the module PARM#MYNAME
The description records are in normal ASCII, and can be edited with a normal editor. Lines starting with C, c or * are skipped (Fortran comment lines) and data after the ! (comment) is skipped. Continuation lines are not like the normal Fortran syntax but use the DCL syntax (- at the end of the line) Spaces are ignored, except within names and types and between the type and its qualifier. Single lines can be up to 255 chars, and the total line length (including continuation lines) can be up to 4096 chars. There are 6 types of lines -Parameter, value &type definitions -Conditional statements -Extra statements -Field Declarations. -Control Statements -Macro definitions During the reading of the description, DIX may use symbol substitution. See the "INTERACT SET SUBST" help topic.
DIX supports macros. A macro starts with the #MACRO NAME [PARAM1 [PARAM2] ...] statement and ends with a #ENDMACRO statement Macros can be used to repeat a number of lines. Inside the macro you specify param1 and param2 by 'param1' and 'param2'. Up to 16 parameters are supported, and macro calls can be nested to a depth of 64 Example: A definition of an ACMS file .... integer*2 menu_offs ubyte menu_leng range (menu_offs: menu_offs+menu_leng) character*(menu_leng) menu end range integer*2 mdb_offs ubyte mdb_leng range (mdb_offs: mdb_offs+mdb_leng) character*(mdb_leng) mdb end range integer*2 init_appl_offs ubyte init_appl_leng range (init_appl_offs: init_appl_offs+init_appl_leng) character*(init_appl_leng) init_appl end range ..... Above description contains a lot of similar statements. They can be replaced by .... #macro item name !define a macro first integer*2 'name'_offs !it contains one parameter ubyte 'name'_leng !name. During expansion range ('name'_offs: 'name'_offs+'name'_leng) character*('name'_leng) 'name' !'name' will be replaced by end range !the actual argument #endmacro !(it may be empty) item menu !call the macro and replace 'name' by menu item mdb !call the macro and replace 'name' by mdb item init_appl !call the macro and replace 'name' by init_appl ....
With the parameter definition, you can define parameter values, that can be used later in other parameter definitions, or in field declarations. Syntax: PARAMETER [(]name=expression[,name=expression] [)] VALUE [(]name=expression[,name=expression] [)] TYPE name=expression PARAMETERs may only be defined once in a description, VALUEs may occur multiple times in a description TYPEs may be used for fieldnames. See below All can be referenced, but none can be updated in interactive mode. The expression is first evaluated at read time. If this fails (i.e. because of dependencies on field data), DIX will retry the evaluation at expand time (when the record data is present) You may not redefine a parameter within a description, but you may redefine a value Examples: PARAMETER VALUE1 = 121 ! Will be evaluated at read time PARAMETER VALUE2 = (VALUE1*4+12) ! Will be evaluated at read time INTEGER*2 Test_field PARAMETER (p1=10) ! Will be evaluated at read time PARAMETER (p2=test_field*10) ! Will be evaluated at expand time PARAMETER (p3=F$FILE("RECORDL")) ! Will be evaluated at read time The value is evaluated as an expression. in the help about "interactive_commands expressions" ![Expressions]DIX INTERACTIVE_COMMAND expressions Parameters may also be defined globally. See the interactive command ADD PARAMETER. ADD VALUE, ADD TYPE and LOAD Example for types: Suppose you want to have a text name for two specific values You could specify INTEGER*4 MYNUMBER [0=zero,5=five] But if the string is used more often you can also use TYPE nice_name ="0=zero,5=five" !declare a type INTEGER*4 MYNUMBER [#nice_name] !use a name starting with a # These types can be refenced in an expression by #[\filetag[\descriptiontag]]typename"fieldname" Suppose the definition is in a description with tag MYDES and a file MYFILE All of the below will return the value (integer) 5 #nice_name"five" #myfile\nice_name"five" #myfile\mydes\nice_name"five"
You can use the symbol table to conditionally use parts of the description. The #IF(DEF), #ELSE, #ELSEIF and #ENDIF are available to dis/enable parts of the description. The syntax is #IF Logical-statement #IFDEF symbolname #ELSEIF Logical-statement #ELSE #ENDIF The Logical-statement is evaluated using the available DIX-symbols and field variables. You can define the symbols in interactive mode via the normal assignments and in other modes via the /DEFINE=symbol qualifier Example (the indentation is just for visibility): #IF F$EXISTS("LANGUAGE") #IF LANGUAGE="DUTCH" CHARACTER*20 DUTCH_NAME #MESSAGE "The Dutch version" #ELSEIF LANGUAGE="GERMAN" CHARACTER*20 GERMAN_NAME #MESSAGE "The German version" #ELSE CHARACTER*20 DEFAULT_NAME #MESSAGE "The default version" #ENDIF #ELSE CHARACTER*20 DEFAULT_NAME #MESSAGE "The default version" #ENDIF If you change a symbol that would affect the #IF/#ELSEIF clauses, you need to force DIX to re-evaluate the description. You can do that via EXAMINE/EXPAND
#MESSAGE text Display message during expansion #COMMENT text Display text in the fields display INCLUDE 'filename[(module)]' LOAD file[/module] #INSERT NAME [expression] Add fieldnames with values computed from other fields. This fields will be displayed with offset "blank", and cannot be modified. The expression can contain fields, parameters, and values from the description, but not symbols, global values/parameters. Example: In the INDEXF description, the ODS-2 filename is split in two parts. at offset 82 are the first 20 character of the filename (field FNAM) and at offset 134 the last 66 characters (field REST_FNAM) You could specify: #INSERT TOTAL_FILENAME [FNAM+REST_FNAM] And DIX would add a field with the name TOTAL_FILENAME and as contents the total filename (all 86 characters). This fieldname can be used and displayed in expressions. If you i.e. specified #INSERT TOTAL_FILENAME [F$TRIM(FNAM+REST_FNAM)] DIX would trim the trailing blanks
This allows you to include a file (or a module in a file) Since this is a typical Fortran statement, Fortran defaults are used formats INCLUDE 'filename' Include a file, default filename = SYS$DISK:[].FOR INCLUDE '(module)' Include a module from a file, default library is SYS$LIBRARY:FORSYSDEF.TLB INCLUDE 'library(module)' Include a module from a file, in .TLB file library Form this file /module ONLY the parameters will be loaded See also the help about interactive mode LOAD
LOAD file Include a file, default filename = SYS$DISK:[].TXT LOAD library/module=modnam Include module from a library. the library will be searched with a default name of SYS$LIBRARY:STARLET.MLB and if that fails SYS$LIBRARY:FORSYSDEF.TLB Form this file /module ONLY the parameters will be loaded See also the help about interactive mode LOAD
You can include the #MESSAGE statement in the description #MESSAGE text The text will be displayed via a message when the expander finds this statement. This can be useful with the #IF constructs see example below. declaration statement declaration statement ... #IF F$EXISTS("_DEBUG") #MESSAGE Debug variant integer*4 temp #ELSE integer*4 temp /nodisplay #ENDIF If the symbol debug is defined the value of temp will be displayed and during the expansion of the descriptions the message "Debug variant" will be displayed on the terminal If the symbol debug is not defined, the value of temp will NOT be displayed and no message will occur.
#COMMENT text This statement can be used in a description or a view The text will be displayed with the examine command You can use this to separate parts of the description or in a view parts from different files Example (for a view): field verslim !examine the version limit field name !examine the name #comment ============To file header:============= follow v(1).fileid !follow the link to the file header loop !loop field *_filename !examine the name in ODS-5 part field fnam !and in ODS-2 part test (file_id <> backl_fid) !stop if fid=backl_fid #comment ============Backlink:============= follow backl_fid !follow link to parent end loop !end of loop
You can use any normal Fortran declaration, with some extensions General format TYPE*(SIZE)[/qualifiers] fieldname[(dim1[,dim2[,dim3]])] The qualifiers must be specified BEFORE the fieldname. The following types are supported The {*n} means an implied size. You may specify the size, but if you do not, this size is assumed. You cannot specify a different size. REAL_F{*4},REAL_D{*8},REAL_G{*8},REAL_H{*16} The data types are the VAX realtypes REAL_S{*4}, REAL_T{*8},REAL_X{*16} The data types are the IEEE realtypes REAL*4,REAL*8,REAL*16 These are aliases, the actual datatype depends on the size and the architecture. The default size = 4. Replacement according to the following table Size Arch 4 8 16 VAX REAL_F REAL_D REAL_H Alpha REAL_F REAL_G REAL_X IA64 REAL_S REAL_T REAL_X COMPLEX*8, COMPLEX*16 The complex datatype (real,imaginary). the complex*8 contains 2 real*4 values the complex*16 contains 2 real*8 values LOGICAL*nn (nn=1..128 in bitfieldmode, 1..16 in normal mode) The date types are the logical data types Default size = 4(bytes) in normal mode, 8(bits) in BITFIELDMODE RLOGICAL*nn (nn=1..128 in bitfieldmode, 1..16 in normal mode) The date types are the logical data types, only the value is reversed Default size = 4(bytes) in normal mode, 8(bits) in BITFIELDMODE CHARACTER*NN or CHARACTER*(NN) The data types are the character datatypes Default size = 1 (byte) [U]INTEGER*nn (nn=1..64 in bitfieldmode, 1..8 in normal mode) The data type is [un]signed integer Default size = 4(bytes) in normal mode, 8(bits) in BITFIELDMODE [U]BYTE is accepted as alias for [U]INTEGER*1 [U]WORD is accepted as alias for [U]INTEGER*2 [U]LONGWORD is accepted as alias for [U]INTEGER*4 [U]QUADWORD is accepted as alias for [U]INTEGER*8 BITS*NN (nn=1..128 in bitfieldmode, 1..16 in normal mode) The data structure is a bit stream, nn<=8 Bytes Default size = 4(bytes) in normal mode, 8(bits) in BITFIELDMODE RBITS*NN (nn=1..128 in bitfieldmode, 1..16 in normal mode) The data structure is a bit stream, nn<=8 Bytes This is the same as BITS, but the meaning of each bit is reversed (0 means active). Default size = 4(bytes) in normal mode, 8(bits) in BITFIELDMODE For the integer and bits fields, you may add a list of names to make the display more readable, see the name_syntax help below DATE*4 The date structure is an internal date format, the number of minutes since 1857 e.g. VMSdate/(10*1000*1000*60) No seconds or ticks (hundredths) are allowed DATE*8 The date structure is a OpenVMS date format. This is the default date data type. UDATE{*4} The date structure is a UNIX time (#seconds since 1-JAN-1970). No ticks (hundredths) are allowed UIC{*4} The data structure is a UIC CPUTIME{*4} The data is a 32 bits integer containing CPU ticks. This will be displayed as a delta time. RAD50{*2} The data is a 16 bit integer contains 3 rad50 chars IDENTIFIER{*4} The data structure is an OpenVMS-identifier RFA{*6} The normal RFA structure. It contains a 2-byte record-id/byte offset and a 4 byte blocknumber. The display is (block,recid) BKTRFA*NN (nn=4,5,6) The data structure is an RFA as found in the indexed file buckets. It contains a 2-byte record-id/byte offset and a 2-4 byte blocknumber. The display is (block,recid) PROTECTION{*2} The data structure is a protection mask. RINTEGER{*4} The data is a INTEGER*4 with low and high 16 bits swapped (PDP-11 compatible format) FILEID{*6} The data is a Fileid (filenr,revnr,volnr) PRIVILEGE*nn The data is a privilege mask The size may be 4 or 8, the default=8 If the size is 8, the value is a normal OpenVMS privilege mask If the size is 4, the value is a privilege mask used for functions like $CHKPRO (the $CHPDEF privilege mask) This type has a built-in fieldname list. DISKMAP The data is an ODS-2/5 storage description found in file headers There are 4 formats. P:dd dd placement map T:1 begin-end 8 bits count and 22 bits blocknumber (4 bytes) T:2 begin-end 14 bits count and 32 bits blocknumber (6 bytes) T:3 begin-end 30 bits count and 32 bits blocknumber (8 bytes) If you do not specify the t:n when converting from text to binary DIX will take the shortest format ACE The data is the binary ACE description The text must include the leading and trailing () ACL The data is a list of ACEs VFC{*1} The data is interpreted as a carriage control byte in a DCL VFC file. See the OpenVMS docs about the layout. BYTEARRAY*(SIZE) The data is a list of bytes, and the display is a line with the byte values separated by a space String types STRING [*NN] The data is a counted ASCII string (count=byte) WSTRING[*NN] The data is a counted ASCII string (count=word) LSTRING[*NN] The data is a counted ASCII string (count=longword) ZSTRING[*NN] The data is zero terminated string HSTRING[*NN] The data is terminated by any char >127 (bit 7 = 1) If *NN is specified, the strings are variable in a fixed allocation size. The total allocation is NN (HSTRING) NN+1 (STRING,ZSTRING) NN+2 (WSTRING) NN+4 (LSTRING) If *NN is not specified the allocation is variable also. DIX can handle display and modification of variable fields, but only if the record length can be changed (indexed or relative files and not fixed). DECIMAL strings [U]DECIMAL The data is an (unsigned) decimal string. Depending on some qualifiers the allowed data is 0..9,".",E,+,- 0..9 are always allowed. If the type is UDECIMAL, the + and - are not allowed. If the type specifies /fraction, the . is allowed If the type specifies /exponent, the E is allowed For this datatype there are some extra qualifiers defined /ZERO_FILL The field is filled with leading zeros. All spaces will be replaced by 0. /FRACTION Allow the string to contain a decimal fraction. This qualifier adds the "." character to the allowed character set. /EXPONENT Allow the string to contain an exponent. This qualifier adds the E/e and the +/- for the exponent (E+12 or e-12) characters to the allowed character set. /LEFT_JUST If the /ZERO_FILL is not specified, this qualifier decides if a short string must be left or right justified. Fieldnames are strings up to 32 characters. They must start with a letter (a-z), and the following character may contain a letter (a-z), a digit (0-9), a $ or an _. Field names starting with a % and PAD fields are not displayed (fillers). These fields cannot be used for field-dependent computation. The display can also be disabled with the /NODISPLAY option, and these fields CAN be used. Qualifiers can be /HEXADECIMAL Always display data in hexadecimal format /BINARY Always display data in binary format /OCTAL Always display data in octal format /RADIX=nn Always display the data in radix nn format This can only be used for [u]integer fields /RANGE=min_val:max_val For integer values, limit the range of the value /NODISPLAY Do not display data (can be referenced) /USER The type is a user defined type. See the help about [DIX/HELP] record_for field usertypes. /UPPERCASE Force conversion to uppercase on field modification /LOWERCASE Force conversion to lowercase on field modification /LIMIT=value If the value is reached, the repeat loop is terminated /LIMIT=>value If the field has a repeat, this will terminate, else /LIMIT=<value DIX will terminate the next structure repeat See example /VFC This field is in the VFC area (if present) of the record /RELATIVE Qualifier for POSITION (see there) /READONLY This field is read-only. DIX cannot modify it. /EBCDIC This field contains EBCDIC data. DIX will convert to and from ASCII. This will only work correctly for characters that are in both character sets. You can also open the file in EBCDIC mode. This will automatically append a /EBCDIC to all fields This conversion only takes place in char/string and decimal fields. /DEPENDENCY If this field changes, DIX must re-expand the description since there is a dependency somewhere on this value. DIX allows you to mark a field as an index into another file To do this you need to specify at least one of the following qualifiers The value of the file will be used as a value for a key/rfa/recnr/byteoffset in the target file. /KEY, /RECORD, /RFA, and /BYTEOFFSET are mutually exclusive. /FILE=filename Specifies that this field is a key into file or 'filename'. The default is the same file. The filename can also be a fileid. See the help about [DIX/HELP] record_format parameters. /FILE="expression" If you specify the name in "", it will be interpreted as a string to be evaluated. In this way you can compute the name. /DESCRIPTION="descr" The explicit description used for this file. /KEY=keynumber Specifies the keynumber (default=0) /RECORD Specifies that the value is a record number into 'filename'. If used on an indexed file, it will read record 'computestring' on the primary key. /RFA Specifies that the value is an RFA into the target file. /BYTEOFFSET Specifies that the value is a byte-index into the target file (value 0 = byte 0 in block 1) /MATCH=LT,LE,EQ,GE,GT Keymatch, the default is EQ search. /COMPUTE="compstring" Allows you to do computation on the field contents the compute string must be a valid expression that delivers an integer or character value to be used as key (for indexed files) or record number. /IF="IFstring" If specified the IFstring expression must be TRUE to take this link. During the evaluation of the IF, COMPUTE and FILE string the normal symbol substitution is active, and also the special symbols $FILE (the current file) $DESCRIPTION (The current description) $FIELD (The contents of the current field converted to text) $FLD (the current field, may be any type) can be used (as any other symbol/function/parameter) See the examples for this See also the radix_override help below Any variable can be followed by a dimension description up to 3 dimensions. Dimension are specified as high (low=1, incr=1) or Low:high (incr=1) or low:high:incr incr may be negative, but then low must be >= high The sizes and dimensions can be expressions with numbers, parameters or other fieldnames in the description. If fieldnames are used, they must appear before the line in which they are referenced. see the help about expressions ![expressions]DIX INTERACT expressions
With the (R)BITS*(*),(U)INTEGER*(*),LOGICAL*(*) and the (u)DATE*(*) declarations you can append a list of names to the description to give a readable interpretation of the values There are two formats 1. [field,field,,field...] A list of fields numbered from 0 up to nn Fields may be omitted, but commas are significant. Mostly used for bits. A # means do never display this bit even if set. 2. [idx=name,idx=name,...] A list of numbered names, the indexes do not have to be in order. Mostly used for integers. The idx's are integer*4 only, if the values are 8 bytes wide, DIX will check if the high longword is a sign extension of the low longword. The text can also be stored in a parameter. if you specify [#type_name], the actual text will be searched in type "type_name". It must be defined earlier via the ADD TYPE command This can be useful if the same strings happens more than once The names (field or name) can have aliases. They are specified as name1;name2;name3... All alias names can be used for text to binary translation, but only the first alias will be used for binary to text translation. See example below Example for case 1 (the privileges in SYSUAF): BITS*8 UAF$Q_DEFPRIV - [CMKRNL,CMEXEC,SYSNAM,GRPNAM,ALLSPOOL,IMPERSONATE,DIAGNOSE,- LOG_IO,GROUP,NOACNT,PRMCEB,PRMMBX,PSWAPM,SETPRI,SETPRV,TMPMBX,- WORLD,MOUNT,OPER,EXQUOTA,NETMBX,VOLPRO,- PHY_IO,BUGCHK,PRMGBL,SYSGBL,PFNMAP,SHMEM,SYSPRV,BYPASS,- SYSLCK,SHARE,UPGRADE,DOWNGRADE,GRPPRV,READALL,- IMPORT,AUDIT,SECURITY] bit(0) = CMKRNL, bit(1)= CMEXEC ... Bits are named in order, but bits may be skipped. If the non-named bits are in the mask they will be displayed with the text "BITnn". If any bit has the name # it will not be displayed (see below) A more complicated example for the bits in the file characteristics in the file header in the INDEXF.SYS The longword has a lot of bits defined, but also a 2-bit field that contains the setting for the caching options First we define all normal bits, and the 2-bit field is defined with #, so they will not be displayed (and cannot be modified using the bitnames). Then we skip 24 bits back and define a 2-bit integer with 4 possible values, and then we skip 22 bits forward again Also notice the ,, after the #, this signifies an unused bit. BITS*4 FILE_CHAR - [Wascontig,Nobackup,Writeback,Readcheck,Writecheck,- Contigb,Locked,Contig,#,#,,Badacl,- Spool,Directory,Badblock,Markdel,Nocharge,Erase,alm_aip,- shelved,scratch,nomove,noshelvable,shelv_res] bitfield !start in bits mode, the next 2 bits define the caching position/relative (-24) !skip back 24 bits, the /relative !is optional since the value is negative integer*2 caching [writethrough,writeback,flush_on_clos,no_cache] position /relative (22) !skip the next 22 bits(in total 3 bytes) end bitfield !back to non-fieldmode again Example for case 2: INTEGER*2 type [1=special,4=normal,10=fatal] Field values 1,4,10 will be by displayed as a name, all others in numeric Example for specification via a TYPE TYPE (user_type = "1=special,4=normal,10=fatal") !must be a string .... !scalar type INTEGER*2 type [#user_type] !reference to parameter user_type. Example for name aliases: In the SYSUAF description is the UAF$L_FLAGS field. One of the bits defines if the user is allowed to login. This bit has two different names 1. In AUTHORIZE this bit is referenced by the /[NO]DISUSER name. 2. In the $UAIDEF include file this bit is called UAI$M_DISACNT So the names for UAF$L_FLAGS contains an alias for this bit BITS*4 UAF$L_FLAGS - [DISCTLY,DEFCLI,LOCKPWD,RESTRICTED,DISUSER;DISACNT,DISWELCOME,DISMAIL,NOMAIL, GENPWD,PWD_EXPIRED,PWD2_EXPIRED,AUDIT,DISREPORT,DISRECONNECT,AUTOLOGIN,- DISFORCE_PWD_CHANGE,CAPTIVE,DISIMAGE,DISPWDDIC,DISPWDHIS,DEFCLSVAL,EXTAUTH, MIGRATEPWD,VMSAUTH,DISPWDSYNCH,PWDMIX] The bit has the name DISUSER;DISACNT. On text to binary you may use either name (DISUSER or DISACNT). On binary to text DIX will use the first name (DISUSER)
For all fieldtypes or normal values containing multiple data, RBITS,BITS,CHARACTER,xSTRING,(U)INTEGER,BYTEARRAY,COMPLEX, UIC,(U)DATE,DELTATIME,CPU,PROTECTION,FILEID,RFA,BKTRFA,RAD50,ACL DIX will normally display all data on one line, and lets you examine/modify the whole structure in one time. Sometimes it may be useful to specify a specific subfield of the whole structure. Below is a table of transformation Subfields can be used with the a. examine command (fieldnames) This will display a multiple line display with each subfield on a separate line. b. Evaluation of fieldnames/symbols. This will deliver a table containing the subfield values For the following type you can only specify a bit/bytenumber CHARACTER,xSTRING byte-size character 1..len(string) BYTEARRAY byte-size byte 1..len(bytearray) (U)INTEGER one-bit integer 0..#bits-1 RAD50 byte-size character 1..3 ACL The ACE in the ACL For the following types you can specify a list of bit values via the fieldnames construct [name1,name2,name1] RBITS LOGICAL BITS LOGICAL The following fields have predefined subfields U(DATE) Integer YEAR,MONTH,DAY,HOUR,MINUTE,SECOND,HUNDREDTH DELTATIME,CPU Integer DAY,HOUR,MINUTE,SECOND,HUNDREDTH PROTECTION Integer SYSTEM,GROUP,OWNER,WORLD FILEID Integer FILENR,REVISION,VOLUME RFA Integer BLOCK,OFFSET BKTRFA Integer RECID,BUCKET PRIVILEGE[*8] Logical The normal 39 privilege names PRIVILEGE[*4] Logical The 12 privileges in the audit log COMPLEX Real REAL,IMAG You may specify a list of either a. subfield name masks (between "") If the name mask does not contain a wildcard (* or %), DIX will match the beginning of the keyword, this may match more than one name. If the name mask does contain a wildcard, DIX will select all names matching the wildcard. or a. element numbers b. ranges like 1:4 c. ranges with stride like 1:5:2 or 5:1:-2 Suppose you have define the following fields RBITS*7 UAF$B_PRIMEDAYS - !value=[t,t,t,t,t,f,f] [MONDAY,TUESDAY,WEDNEDSAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY] CHARACTER*32 UAF$T_ACCOUNT !value=TACV You can now specify UAF$B_PRIMEDAYS{"*T*"} to reference the three one-rlog values 514.1|UAF$B_PRIMEDAYS{TUESDAY} |True 514.3|UAF$B_PRIMEDAYS{THURSDAY}|True 514.5|UAF$B_PRIMEDAYS{SATURDAY}|False UAF$T_ACCOUNT{3:5,1} 54.0|UAF$T_ACCOUNT{3}|C 55.0|UAF$T_ACCOUNT{4}|V 56.0|UAF$T_ACCOUNT{5}| 54.0|UAF$T_ACCOUNT{1}|T But also "TEST"{*} will deliver a table of 4 characters and 10{*} will deliver a table of 32 bits (if integersize=4) The syntax between the {} is "*XYZ*": a mask. This only works on fields with fieldnames defined "AB" : Match all names beginning with AB "*" : All elements with a fieldname * : All elements 4-5 : Element 4..5 4-* : element 4..end_of_field *-4 : element begin_of_field..4 12 : Element 12 only 1:5:2 : Element 1,3 and 5. 5:1:-2 : Element 5,3 and 1 Subfields can be used on fields (you may use the field value names) or normal symbol values
a byte wide integer DIX> exa UAF$B_RTYPE 0.0|UAF$B_RTYPE|1 DIX> exa UAF$B_RTYPE{*} 0.0|UAF$B_RTYPE{0}|1 0.1|UAF$B_RTYPE{1}|0 0.2|UAF$B_RTYPE{2}|0 0.3|UAF$B_RTYPE{3}|0 0.4|UAF$B_RTYPE{4}|0 0.5|UAF$B_RTYPE{5}|0 0.6|UAF$B_RTYPE{6}|0 0.7|UAF$B_RTYPE{7}|0 A UIC DIX> exa UAF$L_UIC 36.0|UAF$L_UIC|[100,1515] DIX> exa UAF$L_UIC{"*"} !display all fields 36.0|UAF$L_UIC{GROUP} |00000001515 38.0|UAF$L_UIC{MEMBER}|00000000100 DIX> exa UAF$L_UIC{"MEM*"} !display fields matching MEM* 38.0|UAF$L_UIC{MEMBER}|00000000100 A data field DIX> exa UAF$Q_LASTLOGIN_N !the normal way 404.0|UAF$Q_LASTLOGIN_N|10-JUL-2008 17:20:01.30 DIX> exa UAF$Q_LASTLOGIN_N{*} !examine all subfields 404.0|UAF$Q_LASTLOGIN_N{YEAR} |2008 404.0|UAF$Q_LASTLOGIN_N{MONTH} |7 404.0|UAF$Q_LASTLOGIN_N{DAY} |10 404.0|UAF$Q_LASTLOGIN_N{HOUR} |17 404.0|UAF$Q_LASTLOGIN_N{MINUTE} |20 404.0|UAF$Q_LASTLOGIN_N{SECOND} |1 404.0|UAF$Q_LASTLOGIN_N{HUNDREDTH}|30 DIX> exa UAF$Q_LASTLOGIN_N{"*"} !examine all fields matching * 404.0|UAF$Q_LASTLOGIN_N{YEAR} |2008 404.0|UAF$Q_LASTLOGIN_N{MONTH} |7 404.0|UAF$Q_LASTLOGIN_N{DAY} |10 404.0|UAF$Q_LASTLOGIN_N{HOUR} |17 404.0|UAF$Q_LASTLOGIN_N{MINUTE} |20 404.0|UAF$Q_LASTLOGIN_N{SECOND} |1 404.0|UAF$Q_LASTLOGIN_N{HUNDREDTH}|30 DIX> exa UAF$Q_LASTLOGIN_N{"*U*"} !examine all fields matching *U* 404.0|UAF$Q_LASTLOGIN_N{HOUR} |17 404.0|UAF$Q_LASTLOGIN_N{MINUTE} |20 404.0|UAF$Q_LASTLOGIN_N{HUNDREDTH}|30
Fieldname and symbols may be used in evaluations with subnames. DIX> examine UAF$Q_LASTLOGIN_N 404.0|UAF$Q_LASTLOGIN_N|10-JUL-2008 17:20:01.30 DIX> eval UAF$Q_LASTLOGIN_N 10-JUL-2008 17:20:01.30 DIX> eval UAF$Q_LASTLOGIN_N{*} [2008,7,10,17,20,1,30] DIX> eval UAF$Q_LASTLOGIN_N{"*U*"} [17,20,30] Now for a symbol DIX> a=UAF$Q_LASTLOGIN_N !contains a date value DIX> eval a 10-JUL-2008 17:20:01.30 DIX> eval a{*} [2008,7,10,17,20,1,30] DIX> eval a{"*U*"} [17,20,30]
DIX> exa UAF$Q_LASTLOGIN_N 404.0|UAF$Q_LASTLOGIN_N|10-JUL-2008 17:20:01.30 DIX> dep UAF$Q_LASTLOGIN_N{"DAY"}=23 DIX> exa UAF$Q_LASTLOGIN_N 404.0|UAF$Q_LASTLOGIN_N|23-JUL-2008 17:20:01.30
DIX> exa UAF$Q_LASTLOGIN_N 404.0|UAF$Q_LASTLOGIN_N|10-JUL-2008 17:20:01.30 DIX> UAF$Q_LASTLOGIN_N{"DAY"}=23 DIX> exa UAF$Q_LASTLOGIN_N 404.0|UAF$Q_LASTLOGIN_N|23-JUL-2008 17:20:01.30 DIX> a=UAF$Q_LASTLOGIN_N a{"DAY"}=25 DIX> say a 23-JUL-2008 17:20:01.30 Or with much more fun DIX> a{2:7}=1 !change all subfields except the year DIX> say a 1-JAN-2008 01:01:01.01 DIX> A{4:7}=[1,2,3,4] !table shape must be equal (both have 4 elements) DIX> say A 1-JAN-2008 01:02:03.04 DIX> UAF$Q_LASTLOGIN_N{4:7}=[1,2,3,4] !table shape must match DIX> exa UAF$Q_LASTLOGIN_N 404.0|UAF$Q_LASTLOGIN_N|23-JUL-2008 01:02:03.04 DIX> UAF$Q_LASTLOGIN_N{"*U*"}=[10,11,12] !table shape must match DIX> exa UAF$Q_LASTLOGIN_N{"*U*"} 404.0|UAF$Q_LASTLOGIN_N{HOUR} |10 404.0|UAF$Q_LASTLOGIN_N{MINUTE} |11 404.0|UAF$Q_LASTLOGIN_N{HUNDREDTH}|12 DIX> exa UAF$Q_LASTLOGIN_N 404.0|UAF$Q_LASTLOGIN_N|23-JUL-2008 10:11:03.12
The user can define his own types. The translations between ASCII and binary must be programmed in the DIX interactive language. This translation script can be defined in the following ways. 1. In the .DES file Somewhere in the .DES file there must be a section the contains the script code. This section must begin with #TYPE name and end with #ENDTYPE 2. In a module in the DIX_DES.TLB (either user or system) library. The module name must be USERTYPE_'name'. In this case the #TYPE and #ENDTYPE tags are not necessary. This script is called with 4 symbols defined 1. ACTION : a string symbol that defines the action to take, values can be SIZE : Return the size (in bits) of the binary data. (only used in variable length data) ASCBIN : Convert from ASCII to binary BINASC : Convert from binary to ASCII 2. DATA : A string variable containing the source data. In case "SIZE" and "BINASC" DATA contains the binary data In case "ASCBIN" DATA contains the ASCII text. In all cases the length of the string is the size in bytes. 3. BITSIZE: An integer value that contains the size in bits. Normally this is 8*length(data), but not for bitfields. 4. FIELDS : The fields as defined in the declaration statement. The script must set the following symbols Case "SIZE" : SIZE, an integer containing the size in BITS. case "ASCBIN" : RESULT, a string variable containing the binary data. SIZE, an integer value containing the size in BITS. case "BINASC" : RESULT, a string variable containing the ASCII text. Also the script must finish with an EXIT statement that returns the status. For BINASC 0 means the text will be suppressed by the /compress qualifier. 1 means is not regarded as "suppressible" For others 1=ok, 2=error. Example: You have a line in the description record: mytype*8/user fieldname !user type mytype, size=fixed to 8. Now we must have either a section in the description record enclosed in the following statements: #type usertype ... #endtype Or a module in the DIX_DES or DIX_DES_USER file with the name USERYTPE_MYTYPE In this case the #type and #endtype are not needed. Below an example of a script that will work. It will convert a 8 byte string to a sequence like 12,34,56,43,123,0,56,9 #type mytype if (action = "SIZE") then !return symbol SIZE (size in bits) size = 8*8 !will not be called since the size is stat = 1 !fixed at 8 bytes (is 8*8 bits) endif if (action = "BINASC") then !return symbol RESULT nk = f$length(data) stat = 0 !assume all bytes are ZERO result = "" for k=1,nk kar = f$extract(k-1,1,data) byt = f$extzv(0,8,kar) if (byt <> 0) stat = 1 !not all bytes ZERO result = result + "," + string(byt) endfor result = f$extract(1,-1,result) endif if (action = "ASCBIN") then !return symbol RESULT and SIZE set noon result = "" k = 0 stat = 2 !assume error in conversion lp2: part = f$element(k,",",data) if (part <> ",") then byt = int(part) if (even($STATUS)) goto err if (byt < 0 | byt > 255) goto err result = result + f$char(byt) k = k + 1 goto lp2 endif size = f$length(result)*8 !return length in bits stat = 1 !successful convert err: endif exit 'stat' !return conversion result #endtype
Normally all fields are displayed in decimal or text. If the fieldtype is followed by the a radix qualifier the display (and also the input is in the requested radix) The following radices are supported /HEXADECIMAL /OCTAL /BINARY Example: INTEGER*4 FIELD Will be displayed and modified in decimal INTEGER*2/BIN DATA Will be displayed and modified in binary INTEGER*2/OCT DATA Will be displayed and modified in octal CHARACTER*3/HEX TMP Will be displayed and modified in hexadecimal
DIX also supports a number of control statements STRUCTURE,ENDSTRUCTURE After the structure statement follows a name optionally followed by a dimension (dim1,dim2,dim3) If the name is specified the fieldname is extended by .structurename. if no name is specified, the fieldname is not extended UNION,ENDUNION MAP,ENDMAP See MAP_SYNTAX below. RANGE,ENDRANGE See RANGE_SYNTAX below BLOCK,ENDBLOCK See RANGE_SYNTAX below POSITION[/RELATIVE] (value) Set the bit/byte offset to the value. The () must be specified. This can be useful in some overlay structures See also the example in RANGE_SYNTAX. The value is the new byte position, unless in a bitfield, where the value is in bits. If the /relative is given (or the value is negative) the value is added/subtracted to/from the current offset, else it new offset=value. POINTER Temporary override the bit offset for the following structure. See pointer_syntax below PAD[*NN] Round up bit/byte-offset to NN fold. nn=2,4,8 The default in bitmode 8 (align to next byte) else 2 (align to next word) Rounding takes 0..NN-1 bytes/bits. The verb ALIGN is a synonym for PAD The /VFC or not decides where the pad is done PAD PACKED|NATURAL Set a policy for padding/aligning. The verb ALIGN is a synonym for PAD PACKED : Align from now on fields on bit/byte boundary NATURAL: Align from now on fields on its natural size i.e. INTEGER*4 will be aligned on a 4 byte boundary The PAD*nn overrules this setting for the next field only. EXIT [condition] If condition is not specified, it will be evaluated true. If condition is true, skip the repeat of the current structure (there must be one) See exit_syntax below ABORT reason [condition] If the abort statement is seen, DIX checks if condition evaluates to TRUE (or is not present). If this is the case, the description is regarded as not valid. This statement can be used to do some sanity checking. See the examples help for an example. DEFAULT INTEGER size Set the default integer size. Size can be 4,8,32 or 64 DEFAULT REAL size Set the default real size Size can be 4,8,16,32,64 or 128 You can also define your own types. See the help about [DIX/HELP] record_form field usertypes. BITFIELD ENDBITFIELD Normally the number after the * will be interpreted as bytes, but between a BITFIELD and an ENDBITFIELD the numbers will be interpreted as bits. Only (U)INTEGER, (R)BITS, LOGICAL and PAD fields are allowed between BITFIELD and ENDBITFIELD. After an ENDBITFIELD the record pointer will be padded to the next byte. Case construct. Select one of the case constructs. SWITCH/CASE/ENDSWITCH See the help about the switch_case_endswitch
The record descriptions can contain one or more RANGES or BLOCKS RANGE[/RELATIVE] (min_offset:max_offset) field field ... END RANGE BLOCK[/RELATIVE] (start_pos:end_pos) field field ... END BLOCK The () are required syntax. The fields start at offset "min_offset" and continue until the offset "max_offset". If the byte_offset is >= max_offset, the rest of the RANGE is ignored. RANGE and BLOCK are very much the same, but after the ENDRANGE is found, the bit offset is restored to the value before the RANGE, and the BLOCK sets the bit offset to end_pos. So if the range/block is in another part of the record you should use RANGE, and if the range/block is inline you should use BLOCK If /relative is specified, the start_pos and end_pos are added to the current bit_offset, otherwise they will set the bit_offset An example is in the ODS-2 File headers: byte id_offset ! Offset to Ident area byte map_offset ! Offset mapping area byte acl_offset ! Offset to ACL area byte res_offset ! Offset to ACL area integer*2 seg_num ! Extension segment number .... range (map_offset*2:acl_offset*2-1) diskmap maps(256) !enough end range ..... position (510) integer*2/hex checksum The DISKMAP entries start at byte offset MAP_OFFSET*2 (MAP_OFFSET is in words) and continues until ACL_OFFSET*2-1. The checksum is at fixed location 510 An example for the BLOCK statement is in the $BUCKET description for a bucket in an indexed file: ... uinteger*2 first_free_byte ... block (14:first_free_byte) !this part extends from byte 14 ..the !value in first_free_byte structure sidrvalues(*) !we don't know how many sidr values there are !but if we cannot exceed the block integer*2 total_len !the total length of the sidrvalue ... !display the keyvalue (compressed or not) block/relative (0:total_len+%loc("TOTAL_LEN")-%location+2) !the sidrvalue record !starts at offset 0 (relative) and continues !until the length is exceeded structure rrvs(*) !the rrvs are limited to the block ... end structure !end of the rrvs end block !end of the rrv block end structure !end of the sidr values structure end block !end of the total block ...
The MAP command has a special syntax. It is included in a UNION statement. UNION MAP [selectionstring] END MAP MAP [selectionstring] END MAP .. END UNION If there is no selectionstring specified, DIX will show the mapping. If there is a selection string, DIX will show the map only if the selection string matches. The format for the selection string is: Expression=sel_value[,sel_value...] And sel_value is 1. expression Just a single (integer) expression 2. expression:expression A range of (integer) expressions At this moment only integer expressions are allowed. You can specify a dependency on a previously defined variable. SYNTAX: integer*4 sel !any field will do (dependency field) UNION MAP SEL=value !Display this map if SEL has value "value" END MAP MAP SEL=VALUE1 !Display this map if SEL has value "value1" END MAP .. END UNION If all maps have a dependency and none of them is used, DIX will always use the last one, unless one of the MAP entries has a dependency fieldname of * Example: integer*4 sel !any field will do (dependency field) UNION MAP SEL = 0,10:12 !case for sel=0 and 10:12 character*4 valuec END MAP MAP SEL = 1 !case for sel=1 integer*4 value4 END MAP MAP * !case for all other values of sel logical*4 valuel END MAP MAP SEL = 2 !case for sel=2 integer*2 value2(2) END MAP END UNION If SEL has value 0 or is between 10 and 12 the character VALUEC is displayed If SEL has value 1 the INTEGER*4 VALUE4 is displayed If SEL has value 2 the INTEGER*2 VALUE2(2) is displayed If SEL has any other value the LOGICAL*4 VALUEL is displayed If the MAP * had not existed, and SEL would not have been 0 or 10-12 or 1 or 2 the last map (SEL=2 : = VALUE2(2)) would have been used.
The pointer statement allows you to decode a piece of data in an other place in the record. Syntax POINTER[*n] [/RANGE=min:max] fieldname [pointee] The next structure block (there must be a structure block directly after this statement) will contain the fields that are part of the pointed data. The *n is optional, default *4 The /range is optional, if allows you to mark certain values of the pointervalue as not valid, so POINTER/RANG=1: name [pointee] will not be taken is the contents of the pointer is <1. The [pointee] is necessary. If contains the fieldname, of which the address will be added to the pointer value to get the correct offset An example is the PENDING structure (pending.dat) for Allin1/Office server: character*64 pending_key !MAIL + the name of the user character*1 record_code !continuation record index character*1 cont_flag ! flag for continuation record integer*2 total_attr_size !total size of the pointers+data ! of all records together integer*2 this_rec_attr !size of pointer+data in this record character*2 usage_count !how often is this record used character*5 new_mail_count !new mail count for the user character*3 padding structure pointers(100) [1] !start of pointer/data integer*2 type [7=mail] !type of field integer*2 %dummy pointer*4 offs [pointers] [2] !offset to the "pointer" field structure work [3] !the data section integer*2 length !length of string byte %unknown(6) character*(length-6) test !the string end structure [4] !end of the data definition exit [offs+length+2>=this_rec_attr] [5] !exit statement end structure The record is built up as follows a. 80 bytes of fixed data b. a pointer section containing an array of 1. Type 2. Offset to a position in the record after the pointers c. the text area pointed to by the offset The statement pointer*4 offset[pointers] at [2] must be followed by a structure statement [3]. DIX will take the value from the record at the position of the pointer statement [2] (the length contains the size of the field), adds the location of "POINTERS" [1], and uses that offset to expand the statements in the structure "work" [3]. When the end structure [4] is found, DIX will resume processing the next statement [5] with the saved offset. At the end [5] is the exit test. If the offs > cur rec length : exit This means to leave the "pointers" structure. Since there is no more data available, the display is stopped. See the display below 0|PENDING_KEY |MAIL JOHN.DOE 64|RECORD_CODE | 65|CONT_FLAG |. 66|TOTAL_ATTR_SIZE |86 68|THIS_REC_ATTR |82 70|USAGE_COUNT | 72|NEW_MAIL_COUNT |3 77|PADDING | 80|POINTERS(1).TYPE |MAIL 84|POINTERS(1).OFFS |16 96|POINTERS(1).WERK.LENGTH|31 104|POINTERS(1).WERK.TEST |OA$SHARA7718:IFQ3FORG.TXT 88|POINTERS(2).TYPE |MAIL 92|POINTERS(2).OFFS |49 129|POINTERS(2).WERK.LENGTH|31 137|POINTERS(2).WERK.TEST |OA$SHARE2664:IFR1XUY1.TXT 96|POINTERS(3).TYPE |31 You could suppress the display of pointers(1).offs, by changing the definition of pointer to : pointer*4/nodisplay offs [pointers] Another example is from the records of the accounting file: BITFIELD INTEGER*1 FLAG INTEGER*7 TOTTYPE [,PRCDEL,PRCPUR,IMGDEL,IMGPUR,SYSINIT,SETTIME,LOGFAIL,PRINT,USER,ENABLE,DISABLE,ALTACM,FILE_FL,FILE_BL] INTEGER*4 SUBTYPE [,INTERACTIVE,SUBPROCESS,DETACHED,BATCH,NETWORK] INTEGER*3 VERSION INTEGER*1 CUSTUMER ENDBITFIELD INTEGER*2 LENGTH DATE SYSTIME STRUCTURE PACKET(10) [1] BITFIELD INTEGER*1 PACKETFLAG INTEGER*7 PACKETTYPE [,ID,RESOURCE,IMAGENAME,FILENAME,USER_DATA,,,PRINT] INTEGER*4 SUBTYPE INTEGER*3 VERSION INTEGER*1 CUSTUMER ENDBITFIELD INTEGER*2 SUBLENGTH UNION MAP PACKETTYPE=1 INTEGER*4/HEX PID INTEGER*4/HEX OWNER UIC UIC INTEGER*4 PRIVS(2) BYTE PRIO BYTE FLAGS POINTER*2/RANGE=1: USERNAMEOFFSET [PACKET] [2] STRUCTURE [3] STRING USERNAME END STRUCTURE [4] POINTER*2/RANGE=1: ACCOUNTOFFSET [PACKET] [5] STRUCTURE STRING ACCOUNTNAME END STRUCTURE .... and some more pointers for other fields END MAP ... for other packettypes END UNION ENDSTRUCTURE The pointer statement at [2] POINTER*2/RANGE=1: USERNAMEOFFSET [PACKET] [2] will be processed as follows. Take the value from the record, 2 bytes The (*2). See if this value is at least 1 (the /rang=1:) If not, skip the following structure [3], and continue with the next [5] If it is >=1, add the value to the offset of PACKET [1] and decode the data at that offset as the structure [3] So we expect a STRING datatype there (the structure contains only one field) After this sidestep (we found the ENDSTRUCTURE [4]), return to processing the data at [5]
The pointer statement allows you to terminate a structure repeat count character*64 test structure pointers(100) [1] integer*4 type [7=mail] integer*4 value exit [type=10] [2] end structure character*10 rest The record is built up as follows a. 64 bytes of fixed data (test) b. a structure section containing an array of 1. Type 2. value c. 10 bytes trailer (rest) The statement "exit [type=10]" at [2] will exit the *100 repeat for [1] if the contents for type = 10. 0|TEST |MAIL 01CURSIST 80|POINTERS(1).TYPE |MAIL 96|POINTERS(1).VALUE |20 88|POINTERS(2).TYPE |MAIL 92|POINTERS(2).VALUE |25 96|POINTERS(3).TYPE |10 <- this terminates with the exit 100|POINTERS(3).VALUE |25 104|REST |The rest If the description had been character*64 test structure pointers(100) [1] integer*4 type [7=mail] exit [type=10] [2] integer*4 value end structure character*10 rest The result would have been (POINTERS(3).VALUE at 100 is not displayed, and so the offset for REST is 4 lower 0|TEST |MAIL 01CURSIST 80|POINTERS(1).TYPE |MAIL 96|POINTERS(1).VALUE |20 88|POINTERS(2).TYPE |MAIL 92|POINTERS(2).VALUE |25 96|POINTERS(3).TYPE |10 <- this terminates with the exit 100|REST |The rest
INTEGER*4 value[_expression] SWITCH value CASE 1 !case taken if value=1 integer*4 value1 character*20 text1 CASE 4 !case taken if value=4 integer*4 val2 logical*4 ext CASE !default case if nothing matches character*(20) default CASE 1 !will not be found, since we had a integer*4 not_used !match before CASE !will not be found, since we had a integer*4 not_used_def !match before ENDSELECT
INTEGER*4 value value contains 4 bytes = 32 bits BITFIELD integer*4 first_nibble value contains 4 bits. logical*1 first_bit[0=no,1=yes] value contains 1 bit PAD 2 Align to even bit (so this takes 1 bit) integer*1 second_bit value contains 1 bit ENDBITFIELD aligns on byte boundary (so 1 pad bits) LOGICAL*1 temp value contains 1 byte.
CHARACTER*12/FILE=SYSUAF Username You can follow this link to the file SYSUAF keyvalue the contents of "USERNAME", KEY=0 INTEGER*4/FILE=DATAFILE/RECORD/COMPUTE="$field+10" index You can follow this link to the file DATAFILE with the record number the contents of the field "index" + 10 INTEGER*4/FILE=SYSUAF/KEY=1/IF="$field>0" identifier Follow the identifier to the SYSUAF file, but only if the identifier is >0 (UIC identifier) Example for not displayable fields: The file_char bits in the INDEXF.SYS contain 2 bits that define the caching attributes (bit 8 and 9). Since the names for these bits are a #, DIX will not display these bits. The POSITION (-24) : Reposition the byte_offset by 24 (bits). The INTEGER*2 : Define a 2 bits integer with 4 possible values. The POSITION/RELATIVE (22) : Sets the byte_offset back to where we were. bits*4 file_char - [Wascontig,Nobackup,Writeback,Readcheck,Writecheck,- Contigb,Locked,Contig,#,#,,Badacl,- Spool,Directory,Badblock,Markdel,Nocharge,Erase,alm_aip,- shelved,scratch,nomove,noshelvable,shelv_res] bitfield !start in bits mode, the next 2 bits define the caching position/relative (-24) !skip back 24 bits, the /relative !is optional since the value is negative integer*2 caching [writethrough,writeback,flush_on_clos,no_cache] position /relative (22) !skip the next 22 bits(in total 3 bytes) end bitfield !back to non field mode again This could also have been achieved by structure !no name attached union map bits*4 file_char - [Wascontig,Nobackup,Writeback,Readcheck,Writecheck,- Contigb,Locked,Contig,#,#,,Badacl,- Spool,Directory,Badblock,Markdel,Nocharge,Erase,alm_aip,- shelved,scratch,nomove,noshelvable,shelv_res] end map map byte %temp1 bitfield integer*2 caching [writethrough,writeback,flush_on_clos,no_cache] end bitfield !will align back to the next byte end map end union end structure
The following description is from the SYSUAF description. The UAF$B_RTYPE is expected to be 1. BYTE UAF$B_RTYPE ABORT wrongtype [UAF$B_RTYPE <> 1] .... rest of description If the UAF$B_RTYPE is <> 1, DIX will assume that the current record cannot be described by this description. DIX will issue a warning "description is aborted wrongtype. The description will remain open for the file, so if another record does have the right UAF$B_RTYPE this record will be displayed using this description.
PARAMETER REP_BITS=2 INTEGER*4 RECNR STRUCTURE DATUSR DATE*4 DATTIM !internal date format #minutes since 1857 UIC*4 UIC !standard OpenVMS UIC format (group,member) END STRUCTURE INTEGER*2 type - !1,4,10 will be by name, all others in [1=special,4=normal,10=fatal] !decimal format INTEGER*2 COUNT INTEGER*4 RESCHED STRUCTURE BITS(REP_BITS) !2 structures, with both bits*1 flag=1 byte long BITS*1 FLAGS [mon,tue,wed,thu,fri,sat,sun] !the total is 2 bytes END STRUCTURE UNION MAP TYPE=Special !this case is valid if type=1 (special) INTEGER*2 time(2) END MAP MAP * !this case is valid for any other field value CHARACTER*2 dunnow ! ENDMAP MAP type=normal !this case is value if type=4 (normal) INTEGER*4 time ENDMAP MAP Type=fatal !this case is valid if type=10 (fatal) ENDMAP !No allocation is this type ENDUNION !total structure length is dependent on type WSTRING*60 MESSAGE !word counted ASCII string with 60 bytes room INTEGER*4 FIELD(1:COUNT) !field has COUNT members
An example about field_following to another file: The example is about 3 RMS indexed files that form a simple source module cross_reference system The first file (CROSS_REF.CRF_FILE_NAMES) has the following description (.CRF_FILE_NAMES in the system or user text library) integer*2 file_nr !primary key character*60 file_name integer*2 %filler The second file (CROSS_REF.CRF_MOD_NAMES) has the following description (.CRF_MOD_NAMES in the system or user text library) integer*2 mod_nr !primary key character*32 mod_name integer*2 file_nr/file=.CRF_FILE_NAMES !link to the filename The third file (CROSS_REF.CRF_CROSS) has the following description (.CRF_CROSS in the system or user text library) integer*2 caller_nr /file=.CRF_MOD_NAMES !link to module name integer*2 called_nr /file=.CRF_MOD_NAMES !link to module name Now if you open a record in the third file $ DIX CROSS_REF.CRF_CROSS %DIX-I-USINGFIL, Using file DSA40:[DIR]CROSS_REC.CRF_CROSS %DIX-I-USINGDES, Using description DIX_SYS(.CRF_CROSS) DIX> EXA * 0|CALLER_NR>|738 !the > tells us there is a link present 2|CALLED_NR>|-262 DIX> EXA/DES * 0|CALLER_NR>|738 Type :INTEGER*2 Linenumber:0 Variable :False Dependency:False Link file :.CRF_MOD_NAMES !and yes there is a link defined Link field:0 Match :EQ 2|CALLED_NR>|-262 Type :INTEGER*2 Linenumber:1 Variable :False Dependency:False Link file :.CRF_MOD_NAMES Link field:0 Match :EQ DIX> Follow CALLER_NR !try to follow this link File .CRF_MOD_NAMES not (yes) opened, open it (y/[n]):Y !do you want to open the file %DIX-I-USINGFIL, Using file DSA40:[DIR]CROSS_REF.CRF_MOD_NAMES %DIX-I-USINGDES, Using description DIX_SYS(.CRF_MOD_NAMES) DIX> Exa * 0|MOD_NR |738 2|MOD_NAME|CHECK_ALLOWED_USER 34|FILE_NR>|66 !and this field has a link defined DIX> Follow file_nr File .CRF_FILE_NAMES not (yes) opened, open it (y/[n]):y %DIX-I-USINGFIL, Using file DSA40:[DIR]CROSS_REF.CRF_FILE_NAMES %DIX-I-USINGDES, Using description DIX_SYS(.CRF_FILE_NAMES) DIX> Exa * 0|FILE_NR |66 2|FILE_NAME|REM_SERVER_CHECK_ACCESS DIX> Back !now back trace %DIX-I-USINGFIL, Using file DSA40:[DIR]CROSS_REF.CRF_MOD_NAMES %DIX-I-USINGDES, Using description DIX_SYS(.CRF_MOD_NAMES) DIX> Exa * 0|MOD_NR |738 2|MOD_NAME|CHECK_ALLOWED_USER 34|FILE_NR>|66 DIX> Back !and again a back trace %DIX-I-USINGFIL, Using file DSA40:[DIR]CROSS_REC.CRF_CROSS %DIX-I-USINGDES, Using description DIX_SYS(.CRF_CROSS) DIX> EXA * 0|CALLER_NR>|738 !the > tells us the is a link present 2|CALLED_NR>|-262 As you see, you can jump around an look at the record structures and links Another example is the .DIR description: integer*2 verslim [32767=None] !version limit bits*1 flags !flag byte string name !bytecounted string (variable) pad*2 !align to word boundary structure v(64) !n*version,fileid integer*2 version fileid fileid/file=[000000]indexf.sys/record- /comp="f$getd($file,""blnr"")+int(f$extr(1,-1,f$elem(0,"","",$FIELD)))" end structure The fileid has a link to the corresponding INDEXF.SYS with a record number equal to the first number in the fileid (layout = (filenr,revnr,volume)) + the record number in INDEXF.SYS of the file header with fileid 0. You need read access to the index file for this $ DIX somedir.dir/int %DIX-I-USINGFIL, Using file USER50:[STUBBF.PROGRAMS.DIX]SOMEDIR.DIR;1/NOMOD %DIX-I-USINGDES, Using description DSA50:[STUBBF.PROGRAMS.DIX]DIX_DES.TLB;54(.DIR) DIX> exa * 0|VERSLIM |NONE 2|FLAGS | 3|NAME |Q.Q 8|V(1).VERSION|1 10|V(1).FILEID>|(63474,3,0) DIX> foll v(1).fileid !follow link to file header File [000000]INDEXF.SYS not (yet) opened, open it (y/[n]):y %DIX-I-USINGFIL, Using file USER50:[000000]INDEXF.SYS;1/NOMOD %DIX-I-USINGDES, Using description DSA50:[STUBBF.PROGRAMS.DIX]DIX_DES.TLB;54(INDEXF) DIX> exa * 0|ID_OFFSET |40 ... 8|FILE_ID |(63474,3,0) ... 66|BACKL_FID >|(62674,1,0) 80|FNAM |Q.Q;1 ... DIX> Follow backl_fid !follow link to parent directory 0|ID_OFFSET |40 ... 8|FILE_ID |(62674,1,0) ... 66|BACKL_FID >|(44986,1,0) ... 80|FNAM |SOMEDIR.DIR;1 ... DIX> back !back to the file header DIX> exa * 0|ID_OFFSET |40 ... 8|FILE_ID |(63474,3,0) ... 66|BACKL_FID >|(62674,1,0) 80|FNAM |Q.Q;1 ... DIX> back !back to the entry in the somedir.dir file %DIX-I-USINGFIL, Using file USER50:[STUBBF.PROGRAMS.DIX]SOMEDIR.DIR;1/NOMOD %DIX-I-USINGDES, Using description DSA50:[STUBBF.PROGRAMS.DIX]DIX_DES.TLB;54(.DIR) DIX> exa * 0|VERSLIM |NONE 2|FLAGS | 3|NAME |Q.Q 8|V(1).VERSION|1 10|V(1).FILEID>|(63474,3,0)
Example for the /LIMIT qualifier: Description CHARACTER*10 TEXT STRUCTURE data(100) INTEGER*4 flag/limit=>100 CHARACTER*20 what END STRUCTURE If the field limit contains a value > 100, the repeat for the structure data(100) will be terminated. CHARACTER*10 TEXT STRUCTURE data(100) INTEGER*4 flag(5)/limit=>100 CHARACTER*20 what END STRUCTURE If the field limit contains a value > 100, the repeat for the structure flags (5) will be terminated, but the repeat for the structure will be continued
You can search records in three ways. a. Via the key record selection (/ge/gt/eq/le/lt). This will only work for indexed or relative files b. Via the record selection (/record). This will work for all types of files c. Via a search on record contents. This help page describes this method. DIX has a powerful record search function. You can look for data in records, but also in fields (if you have a description). Parameters 2..8 can be used for search input. If the fields are not text-fields but binary data, DIX will do a convert of the search string to binary and then do the compare. DIX also allows you to search data in more than one record, so a query like "search a record that contains A and the next record contains B" is possible, and this is not limited to just 2 records. The search can be a simple locate, or a wildcard match, or a compare (le,le,eq,ge,gt), and the compares can be done in any known type. The searchsyntax is Parameter [parameter2] [parameter3...] Up to 7 parameters. If more than one parameter is given, parameter2 must match data in the following record, parameter3 in the next record and so on. Each parameter has the syntax (a list of values and qualifiers) string1[/qual],string2[/qual],.. Search can be used in 4 places Interactive mode : Entered on the command line or in the interactive commands: Will set the record pointer to the first match Screen mode : Will set the record pointer to the first match DECwindows mode : Will set the record pointer to the first match File mode : Will display all records matching the search (unless /count is given)
All these examples are for the DIX/FILE mode. They can also be used for the screen and interactive mode. The file mode will display all matches, the interactive and screen will select the first record that matches. 1. $ DIX/FILE data.dat TEST Display all records that contain TEST (/MATCH=LOCATE). The search is NOT case sensitive. 2. $ DIX/FILE data.dat TEST,12/FIELD=FOR*MAT/MATCH=GE Display all records that contain TEST (/MATCH=LOCATE), OR have the value in any field that matches "FOR*MAT" >=12 3. $ DIX/FILE data.dat TEST/LOGIC=AND,12/FIELD=FORMAT/MATCH=GE Display all records that contain TEST (/MATCH=LOCATE), AND have the value of field "FORMAT" >=12 4. $ DIX/FILE data.dat TEST/WINDOW=(position=10,size=40) Display all records that contain TEST (/MATCH=LOCATE) in the byte 10..49 of the record. The search is NOT case sensitive. 5. $ DIX/FILE data.dat *XYZ/MATCH=match Display all records that match *XYZ (so the XYZ must be at the end of the record. 6. $ DIX/FILE data.dat "TesT"/case_sensitive Display all records that contain TesT is this case. 7. $ DIX/FILE data.dat string1,string2/next_record/wild=extended Display the records that contains string1 and the next record matches string2 (with extended wild characters). Only the first record is displayed. 8. $ DIX/FILE data.dat 123:456/match=range/field=myfield Displays the records that contain a value between 123 and 456 (including) in field myfield 9. $ DIX/FILE data.dat 123/field=myfield/type=integer*2/mat=eq Displays the records that contain an value of 123 in the first two bytes (converted as integer*2) of the field myfield Field myfield does not have to be of type integer. 10. $ DIX/FILE data.dat 123/field=myfield/type=integer*2/wind=(pos=10)/mat=eq Displays the records that contain an value of 123 in the bytes 10,11 (converted as integer*2) of the field myfield. If bytes 10-11 do not exist in the field, the match returns false. 11. $ DIX/FILE data.dat 123:456/field=myfield/wind=(pos=10,siz=4)/mat=Range Displays the records that contain an value between 123 and 456 in the bytes 10-13 (converted as integer*4 (size=4)) of the field myfield. If bytes 10-13 do not exist in the field, the match returns false. 12. $ DIX/file data.dat *str*ing1*/mat=match/wild 1234/matc=eq/field=myfield search for a record that match *str*ing1* AND the next record contains the value 1234 in field myfield. 13. $ DIX/FILE data.dat string1 string2 string3 Will search for a record that contains "string1" AND the next record contains "string2" AND the third record contains "string3". Record 1 will be displayed, record 2 and 3 not. 14. $ DIX/FILE data.dat string1 string2/show string3/show Will search for a record that contains "string1" AND the next record containing "string2" AND the third record containing "string3". Record 1 will not be displayed, record 2 and 3 will. 15. $ DIX/FILE data.dat string1 10/mat=ge/loca=recl string3 Will search for a record that contains "string1" AND the next record has a record length of 10 or more, AND the 3 record contains string3 16. $ DIX/FILE SYSUAF RESTRICTED/field=*flag*/mat=eq Will search all SYSUAF records that have ONLY the restricted flag 17. $ DIX/FILE SYSUAF DISACNT/field=*flag*/mat=ge Will search all SYSUAF records that have AT LEAST the DISACNT flag 18. $ DIX/FILE filename "1"/win=(pos=0,size=1)/log=and,1/loca=recl/match=eq Will search all records with a ! in the first position and no more on the line (record length=1) 19. $ DIX/FILE filename 10:12/loca=recl/match=range Will search all records with a record length between 10 and 12
Search the file in the backward direction. Beware that this may take a long time, especially for sequential files (backspace is implemented as a rewind/read n-1 records).
The text in STRING is to be matched case sensitive. DCL will change all parameters to uppercase unless within quotes. So if you use /case_sensitive, make sure STRING is within quotes. This qualifier is positional, so each search item can have its own value.
If the /field is specified, DIX checks if the field is present. If the /WINDOW is also used, DIX checks if the range specified is in the record (no /FIELD) or in the field. The search string will not be used in this case.
/FIELD=NAMEMASK namemask is fieldnamemask descriptionmask\fieldnamemask filenamemask\descriptionmask\fieldnamemask If filename mask is present, the pattern is matched against the filename if no match is found, this entry is skipped. If descriptionname mask is present, the pattern is matched against the description. If no match is found, this entry is skipped. Normally DIX will search the string in the whole record. If you enter /FIELD only the field(s) that match the "fieldnamemask" are searched. This match uses the normal OpenVMS wildcard * and %. See the examples, see also the /WINDOW qualifier. The type of the field (integer, character, etc.) determines the way the compares are done. For example, for INTEGERS the compare is done in binary etc. This qualifier is positional, so each search item can have its own value.
/LOCATION=location_value Where the data should be searched. location_value can be data : The normal data (Default) VFC : The VFC data both : In the VFC as well in the normal data recl : Special value for comparing record_length. In the case only the /match=lt,le,eq,ge,gt and range can be used. The default will be eq
/LOGIC=AND /LOGIC=OR !Default If you specify /LOGIC=AND, this string must match as well as the next. This qualifier is positional, so each search item can have its own value. Example: STRING1/LOGIC=AND,STRING2 Matches only if both STRING1 and STRING2 are found. STRING1/LOGIC=OR,STRING2 (the /logic=or is default) Matches only if either STRING1 or STRING2 are found. STRING/LOGIC=AND,STRING2,STRING3 Matches only if either (STRING1 and STRING2) or STRING3 is found.
/MATCH=LOCATE (Default) /MATCH=MATCH /MATCH=LT /MATCH=LE /MATCH=EQ /MATCH=GE /MATCH=GT /MATCH=RANGE Defines the match. This qualifier is positional, so each search item can have its own value. See also the /wildcard qualifier LOCATE : The string must occur somewhere in the (part of the) record MATCH : The string must match the whole record LE,LE,EQ,GE,GT : The value is compared with the STRING. This can be used with a /FIELD If the field value is a numeric value, compares are done in the normal numeric way. If the field value is a STRING, compares are done as strings. See also the /TYPE command to overrule the default type. For the [R]BIT datatype DIX has the following rule: LE : All specified bits may be present, but not more GE : All specified bits must be present, but there may be more LT : All specified bits may not be present EQ : All specified bits must be present, but not more RANGE : The search string is LOW:HIGH. A match will be found it the value is between LOW and HIGH (including the boundaries). Example: 123/FIELD=UAF$W_BYTLM/MATCH=GE (binary (integer*2) field) Will display all records with the UAF$W_BYTLM value >=123. (binary compare) XYZ/FIELD=UAF$T_USERNAME/MATCH=LT (ASCII (character*12) field) Will display all records with the UAF$T_USERNAME value <XYZ (ASCII compare) 123:345/field=UAF$L_BYTLM/MATCH=RANGE (binary (integer*4) field) Will display all records with BYTLM between 124 and 345
With the /NEXT_RECORD you can specify a search over more than one record. If you specify string1,string2/next_record, DIX will look for records that contain string1 in this record and string2 in the next record. This should normally be done by using more than one parameter, and the above example is equivalent to : string1 string2, but if you need more than 6 records to match, you need this option (DCL allows only 8 parameters). This qualifier is positional, so each search item can have its own value.
The result of the test will be reversed. So a match with /LOCATE will return true if the string is not found. This qualifier is positional, so each search item can have its own value.
/RECORD=N Start search at record N. If /record is not specified, DIX will start the search from the first (or current) record N can be negative, in that case DIX will start from N record before the end_of_file. See also the /LIMIT qualifier. Example: (assume a file of 50 records) /RECORD=5/LIMIT=10 ! Search record 4..14 /RECORD=-10/LIMIT=4 ! Search record 41..44
If no /show is given on a multi record search, the first record is displayed You can give a /show for any of for all records. See the examples
/TYPE=datatype[*size] This allows you to overrule the default datatype (the type of the field, or CHARACTER if no field is given). Datatype can be any valid declaration i.e. INTEGER, CHARACTER, UIC, BITS, etc. The size has its default for each datatype (see the description help) "help record_format_for_descriptions field_decl"
/WINDOW=(position=n,size=m) Do not use the whole record, but take a subset. See also the /FIELD qualifier. Position starts at byte 0. Size defaults to 1. If the /TYPE is used, the size defaults to the size of the datatype. This qualifier is positional, so each search item can have its own value.
/WILDCARD=NONE /WILDCARD=STANDARD (Default) /WILDCARD=EXTENDED /WILDCARD=NONE No wildcard matching is used. /WILDCARD=STANDARD The following wildcard characters can be used * : matches all substrings (0 or more chars) % : matches exactly 1 char /WILDCARD=EXTENDED The Following extended wildcard characters can be used [abc] : Matches a "a" or a "b" or a "c" [-abc]: Matches anything except a,b,c [a-z] : Matches all letters (a-z) [-a-z]: Matches anything except letters 'a : Char "a" is no longer a special char ([*%' etc.) ~ : If in front of the search string, the search string must be in the beginning of the line, if at the end of the search string, the search string must be at the end of the line ! : Matches one or more whitespace chars
The search string must be converted to a specific type. If this conversion succeeds, this match succeeds This qualifier can be useful if you have specified a /FIELD with a wildcard somewhere, and the matching fields have different types.
DIX has a number of descriptions. They are stored in the DIX_DES.TLB file. If you want to add descriptions you may add them to this .TLB file, or if you do not have write access to this file, you may add them to the DIX_DES_USER.TLB file which can be placed in your own directory. See the help about [DIX/HELP] "/user_library". The standard descriptions are (besides a number of entries for my own use)
A description for a disk block containing one or more indexed-files areas. You must open the indexed-file in block-mode. DIX[/int] indexedfile/block=1/record=n/descr=$area If the record=n points to a block that contains areas, this description will show the contents of the area(s).
A description for a disk block(s) containing one or more indexed-files buckets. You must open the indexed-file in block-mode. DIX[/int] indexedfile/block=k/record=n/descr=$bucket DIX> exa * DIX> FULL_BUCKET=1 DIX> exami/expand in the /block=k, the k is the bucket_size of this bucket. If the record=n points to a block that contains a bucket, this description will show the contents of the bucket. All variants of the bucket (INDEX, SIDR and DATA) are supported If you want to see the contents of the record data in the data-buckets, you must define a symbol FULL_BUCKET.
A default description containing BYTEARR $BYTES(record_length) CHARACTER*(record_length) $LINE CHARACTER $CHARS(record_length)
A description for a disk block(s) containing one or more indexed-files key blocks. You must open the indexed-file in block-mode. DIX[/int] indexedfile/block=1/record=n/descr=$key If the record=n points to a block that contains a key block, this description will show the contents of the key.
A description for a disk block(s) containing and indexed/relative-file prologue block. You must open the indexed-file in block-mode. The prologue block is the first block in the file. DIX[/int] indexedfile/block=1/record=1/descr=$prologue
The whole record will be display as a character line. Unprintables will be displayed depending on the "SET FORMAT" command
The layout of the All-In-1/office-server DAF file records.
The layout of the SECURITY.AUDIT$JOURNAL file.
The layout of a backup save set This description will match all files with names *.BCK and *.SAV
The layout of directory file records
The layout of ACCOUNTNG.DAT file records
The layout of the All-In-1/office-server DOCDB file records.
The layout of the All-In-1/office-server FILECAB file records.
The layout of the INDEXF.SYS file records, but only those records that contain file headers. The first few hundred blocks contain a bitmap of used file headers
The layout of the LMF$LURT file. This file contains the information about how many license points are needed for all computer types for the various types of licences
Files containing monitor recording files
The contents for the NETPROXY file
The contents for the NET$PROXY file
The layout of the All-In-1/office-server NETWORK file records.
The layout of the All-In-1/office-server PARTITION file records.
The layout of the All-In-1/office-server PENDING file records.
The layout of the All-In-1/office-server PROFILE file records.
The layout of disk quota files, disk:[000000]QUOTA.SYS
The layout of the All-In-1/office-server RESERVATIONS file records.
The layout of the RIGHTSLIST file records.
The layout of the SYSUAF file records.
The layout of the first (2) block(s) of the SYSDUMP.DMP file To be used with $ DIX/block=2 SYS$SYSTEM:SYSDUMP.DMP
The layout of the VMS$PASSWORD_HISTORY file records.
The layout of the VMSMAIL_PROFILE file records.
By default, DIX is not case sensitive, all commands/data will be converted to upper case (unless within quotes). You can enable case_sensitivity via the interactive command DIX> enable case or disable case or set process/case_lookup You can also enable case_sensitivity on the command line via the /flag=case_sensitive, but you also need to tell DCL that you want case_sensitive mode via the command: $ SET PROCESS/PARSE_STYLE=EXTENDED I am sorry, but that will not work on VAX (and older alpha versions) If you work in case_sensitive mode, all symbol/field/parameter names are case sensitive, and also values from commands are not uppercased. So i.e. if you want to read a record from an indexed file (with the /eq=xyz qualifier), you need to specify xyz in the correct case (and you do not need the ""'s) For more info see the help about "interac set case" Examples: DIX> exa sym1 !in case sensitive mode the symbol sym1 is printed !in not case_sensitive mode SYM1 DIX> exa "sym1" !in both cases the sym1 is printed
Version Author Date Comment 1.0 F.S. 19-jan-1991 Initial release 1.1 F.S. 1-mar-1991 Support for sequential files 2.0 F.S. 1-jan-1992 Use of SMG routines 2.1 F.S. 26-feb-1992 Support block I/O 2.2 F.S. 27-feb-1992 Support fieldnames for bits values 2.3 F.S. 18-mar-1992 Support for multiple files 3.0 F.S. 1-jul-1998 Multiple changes support for parameters support for run-time evaluation of expressions 3.1 F.S. 10-mar-2003 Support for scripting in interactive mode 3.2 F.S. 16-Jun-2003 Added user defined keys 4.0 F.S. 7-may-2004 Added user defined types 5.0 F.S. 19-apr-2006 Added a lot of new features, see the release_notes 6.0 F.S. 1-dec-2006 Added DECwindow interface 7.0 F.S. 1-feb-2008 Added views and a lot more 7.1 F.S. 14-apr-2009 Added a lot of DCL compatibility 7.2 F.S. 1-dec-2009 Added compiled scripts/indexed symbols 8.0 F.S. 1-oct-2011 Added plot command 8.1 F.S. 22-mar-2012 Added plotting of CSV files 8.2 F.S. 31-oct-2012 plotting pie charts. 8.3 F.S. 1-oct-2013 Smaller enhancements, access to library modules Added description and structured type symbols. 8.4 F.S. 1-jun-2014 A lot of smaller enhancements, Added complex datatype Added auto command completion (set term/auto) 8.5 F.S. 1-mar-2016 Smaller enhancements', added pdf output for plots 8.6 F.S. 1-sep-2016 Added checksums for sha, md5 8.7 F.S. 1-jan-2019 Added the DECENT command c
For interactive, screen and DECwindows mode only. Set the autosave flag to enabled. If you later exit DIX, the context will be saved, and you can restore with DIX/RESTORE See also the "modes restore", "interactive_com set auto" help
In DECwindows mode only. You can set some attributes of the DECwindows displays. You can later change them via the interactive command SET DECW[/qualifiers] Syntax /ATTRIBUTES=(attr,attr...) Attr can be HEIGHT=n : The height of the main display in pixels The default is 80 characters, so it depends on the font WIDTH=n : The width of the main display in pixels The default is 30 lines, so it depends on the font FONT=name : Name can be Small, Medium, Large, name=fontname The default is medium on display with more than 1024 pixels, and small for smaller ones. COLOUR=display=(fore=colour,back=colour,High=colour) : Change the colours for the various displays The default colours are background=gray50, foreground=white, high=red Display can be main The main display offset The offset part of the main display field The field part of the main display value The value part of the main display bar The scroll bars menu The menu message The message display alldisplay The all-format display desdisplay The description display
If the /BINARY qualifier is given, the program will display the data in binary. The default is /HEX in raw dump mode. The default is /DECIMAL in interpreted mode. See also the /HEX, /BINARY and /OCTAL qualifier. /BINARY is a shortcut for /radix=2
/BLOCKED[=blocksize] /BLOCKED[=blocksize.bytesize] If the /BLOCK qualifier is specified, the file is accessed via block I/O. You can either specify a number, this will interpreted as a number of disk blocks, or a block.byte where you can specify part of one or more blocks. The total size cannot exceed 65535. The data transfer is done via a blocksize 512 bytes, and no record structure is assumed. This method can destroy file/record integrity and should only be used if you know what you are doing. Blocksize is default 1 (512 bytes if you specify /BLOCKED). It can be useful for files with undefined record type (as the DUMP file). In blockmode you can use the /record=n qualifier to select the 'n'th record of the /blnr=n to start the read at virtual blocknumber 'n' Examples: $ DIX/INT filename/block=4 !use a block size of 4*512 bytes $ DIX/INT filename/block=0.32 !Use a blocksize of 32 bytes $ DIX/INT filename/block=2.32 !Use a lblocksize of 1056 (2*512+32) $ DIX/INT filename/block=0.1056 !the same as above $ DIX/INT filename/block=0.128/rec=6 !read blocknumber 2, bytes 128..255 $ DIX/INT filename/block=0.128/blnr=2 !read blocknumber 2, bytes 0..127 $ DIX/INT filename/block=2/rec=4 !read blocknumber 7 and 8 $ DIX/INT filename/block=2/blnr=4 !read blocknumber 4 and 5
/BLNR=nn If block mode I/O, you can select a virtual blocknumber to start the read $ DIX/INT filename/block=0.128/rec=6 !read blocknumber 2, bytes 128..255 $ DIX/INT filename/block=0.128/blnr=2 !read blocknumber 2, bytes 0..127 $ DIX/INT filename/block=2/rec=4 !read blocknumber 7 and 8 $ DIX/INT filename/block=2/blnr=4 !read blocknumber 4 and 5
/COMMAND dix_command(s) In command mode /COMMAND=dix_command(s) In interactive mode The command mode will start DIX and execute dix_command with all functions available in interactive mode. You may specify multiple commands separated by ;'s command;command;command.. This mode does not allow parameters. In interactive mode (DIX/inter/command=(command[,command)) [parameters] The will startup DIX in interactive mode, inclusive the parameters and execute the commands. COmmand lines not starting with a /, will have the /command qualifier inserted before the line, unless the symbol DIX_NO_AUTO_COMMAND is set to Y Examples: DIX/COMMAND dir *.*/sort=(organization,date=creat) Will generate a list of files sorted by 1. Organization (idx,rel,seq) 2. The creating date DIX/INTER/COMMAND=("while true","exam uaf$t_user*","next rec","end while") - sysuaf Display a list of users defined in the SYSUAF file.
By default DIX will display all fields. If you specified /COMPRESS, "empty" fields will not be displayed. For text data "empty" means all blank (spaces, binary %X20) For binary data "empty" means all zeros (binary %X00)
/COUNT[=number] If the /COUNT qualifier is given, the program will dump "number" records. If number is omitted, DIX will default to /COUNT=1 if a record is specified via the /LT,../GT or the /RECORD qualifier and to /COUNT=0 (all records) otherwise. This will only work in FILE_ORIENTED mode. The /LIMIT qualifier limits the number of records searched, the /COUNT the number of results
/CSV /CSV=(Csv_option[,csv_option...]) Csv_option can be HEADER : Print a header line before all data NOQUOTES : Do not 'quote' fields (see below) ALL_QUOTES: User quotes around all fields SEPARATOR=COMMA : Use COMMA as separator (Default) SEPARATOR=TAB : Use TAB char as separator SEPARATOR=COLON : Use COLON (:) as separator SEPARATOR=BAR : Use | as separator SEPARATOR=SEMICOLON: Use SEMICOLON (;) as separator SEPARATOR=CHARACTER=%Xdd : Use %Xdd as separator QUOTE=DOUBLEQUOTE : Use the " character for quotes around fields (Default) QUOTE=QUOTE : Use the ' character for quotes around fields QUOTE=CHARACTER=%Xdd: Use the %Xdd character for quotes around field If you want quoting (the default), DIX will insert the "quotecharacter" around text fields and field that contain the "separatorcharacter" or space If you specify ALL_QUOTES, DIX will insert the "quotecharacter" around all fields. If you specify NOQUOTES, DIX will never insert the "quotecharacter" The header fields are regarded as "text" fields. See also the /SELECT qualifier for help about selection of fields Example: DIX/FILE/CSV=(header,all_quotes,quote=quote,separator=semicolon) file Output is a file with all fields quoted, using ' as quote and ; as separator with a header line. DIX/FILE/CSV=(header,noquote,separator=char=32) file or DIX/FILE/CSV=(noquote,separator=char=%X20) file Output is a file with no fields quoted, and SPACE as separator
If the /DECIMAL qualifier is given, the program will display the data in decimal. The default is /HEX in raw dump mode. The default is /DECIMAL in interpreted mode. See also the /HEX, /BINARY, /OCTAL and /RADIX qualifier. /DECIMAL is a shortcut for /radix=10
/DECWINDOW If the /DECWINDOW qualifier is given, the program will display a record, (either interpreted or raw) and lets you specify editing (only in /MODIFY mode) or display commands. You can 1. Alter display formats (raw/interpreted) 2. Modify/insert/delete records (only in modify mode) Press the PF2/HELP key for info in screen mode. The /DECWINDOW qualifier must be the first on the command line. This mode will only work if you have DECwindows installed.
/DEFINE=(definition[,definition...]) A definition can be 1. name : This will deliver an integer symbol with the value 1 2. name=value : DIX will try to convert value to integer. If this succeeds an integer symbol will be defined. If this fails a character symbol will be defined. See also the /script qualifier
DIX/DEMO [demoname] The [demoname] is a mask for the selection of demos. Start a demonstration. If you do not specify the demoname, or the mask matches more than one demo DIX will display a screen with a list of demos. You can then select one and a demo slide-show will begin.
/DISPLAY=(displayitem[,displayitem...]) /DISPLAY=ALL Default Valid with /FILE only. This qualifier defines which parts of the record are printed. Valid displayitems are [NO]RECNR : Print the record number [NO]RECSIZE : Print the record size [NO]VFC : Print the VFC part of the record (If the file contains VFC data) [NO]DATA : Print the data part of the record [NO]RFA : Print the RFA of the record ALL : Print all parts WHOLE_RECORD : Do not try to format, just dump the whole record. In this case all other flags are cleared. You may use /FORMAT to select the display of binary data, the default is passall. You may also specify /display=(whole,[recnr],[recsize],[rfa]) to add an additional record with this info. [NO]WRAP : If set, DIX will wrap output to terminal width. The default is WRAP [NO]BIT_OFFSET: Force offsets to be displayed with the bit offset part. Normally DIX displays bit_offsets only if somewhere in the record a data field is not byte aligned. SEPARATOR=sep : Set the separator between offsets/fieldnames/data Allowed options are SEPARATOR=COMMA : Use COMMA as separator SEPARATOR=TAB : Use TAB char as separator SEPARATOR=COLON : Use COLON (:) a separator SEPARATOR=SEMICOLON: Use SEMICOLON (;) as separator SEPARATOR=BAR : Use | as separator (Default) SEPARATOR=CHARACTER=%Xdd: Use %Xdd as separator DESCRIPTION : Display the description of a field after the field data.
The file contains EBCDIC data. DIX assumes the whole record is EBCDIC. You can also define fields with EBCDIC contents. If you have a description present, DIX will add a /EBCDIC to all fields. If you have no description the raw display will display the data after conversion to ASCII
/FAST=number /FAST=1024 (Default) If you specify /FAST, DIX will read the file bypassing RMS, using SYS$QIOW to access the data blocks. This may speed up searches for indexed files, skipping the overhead for RMS-locking. It also allows you to read (not modify) files that are locked. Since DIX bypasses RMS locking there is no guarantee that you will get the correct data, you are completely on your own. If number is positive, it specifies the size of the buffers (in blocks), DIX will use for file I/O. If you specify number as -1, DIX will map the file in memory via a SYS$CRMPSC function and all I/O will be done via paging. On Alpha and IA64 DIX will choose between p0 and p2 space depending on the size of the file. Specifying number=-2, will force p2 space. For searches though files it may speed up things, but not always. It depends on how the buckets are distributed over the file. If the buckets are mostly sequential in the file, DIX can use large buffers, and read many buckets in one I/O. If buckets are scattered over the file, these large reads will not be beneficial, and a normal search with the SYS$GET may be faster. The qualifier is supported for all types of files, but the gain for non-indexed files may be small.
DIX will dump the record(s) like OpenVMS dump, or if a description is given in description format. If you do not specify /COUNT DIX will output all records of the file. The /FILE qualifier must be the first on the command line.
/FLAG=(name[,name...]) Set initial mode settings for interactive, DECwindows and screen mode name can be DCL_COMPATIBLE : For scripts DCL_FALLBACK : Dcl_compat + spawning of unknown verbs USE_MOUSE : Enable mouse usage LOW_FIRST : For multidimensional tables CASE_SENSITIVE : Enable case sensitive mode For more info see the help in interactive_mode set ...
/FOLLOW=(begin,[skipkey]) /FOLLOW=(end[,skipkey]) /FOLLOW=(field[,skipkey]) This is an easy way to generate a one line view The generated source for the view file is "field/foll=begin|end|field[/skipkey] *" See the documentation about VIEWs for more info If you have a file with a description that contains a link to another file DIX can automatically include the fields from that file. If you specify /FOLLOW=BEGIN, DIX will first follow all link fields, and then display all fields of current description If you specify /FOLLOW=END, DIX will first display all fields of the current description, and then the follow fields. If you specify /FOLLOW=FIELD, DIX will follow the link directly after the follow field is found. If you ADD the skipkeys keyword, DIX will not print the keyfields of the followed file, since that value will probably also be a field in the follow field. Examples: This example is a set of the files that make a (simple) cross reference system File 1. name.CRF_CROSS Contains records with 2 numbers. First the module number of the caller And then the module number of the callee integer*2 /file=.CRF_MOD_NAMES caller_nr !link to mod_names integer*2 /file=.CRF_MOD_NAMES called_nr !link to mod_names File 2. name.CRF_MOD_NAMES Contains the module number and the name and a link to the filename There is a key on the mod_nr integer*2 mod_nr character*32 mod_name integer*2 /file=.CRF_FILE_NAMES file_nr !link to file_names File 3. name.CRF_FILE_NAMES Contains the file number and the file name There is a key on the file_nr integer*2 file_nr character*60 file_name $ DIX/FILE/COUNT=1/CSV=HEADER name.CRF_CROSS !DIX will not follow the links "CALLER_NR","CALLED_NR" 738,-262 $ DIX/FILE/COUNT=1/CSV=HEADER name.CRF_CROSS/FOLLOW=END "CALLER_NR","CALLED_NR", "MOD_NR","MOD_NAME","FILE_NR", "FILE_NR","FILE_NAME", "MOD_NR","MOD_NAME","FILE_NR", "FILE_NR","FILE_NAME" 738,-262, !both caller and callee 738,"CHECK_ALLOWED_USER",66, !info about caller number 66,"REM_SERVER_CHECK_ACCESS", !and its file -262,"SYS$VERIFY_PROXY",69, !info about callee 69,"SYSTEM" !and its file The indentation is only to show the actions. $ DIX/FILE/COUNT=1/CSV=HEADER name.CRF_CROSS/FOLLOW=FIELD "CALLER_NR", "MOD_NR","MOD_NAME","FILE_NR", "FILE_NR","FILE_NAME", "CALLED_NR", "MOD_NR","MOD_NAME","FILE_NR", "FILE_NR","FILE_NAME" 738, !caller number 738,"CHECK_ALLOWED_USER",66, !its name 66,"REM_SERVER_CHECK_ACCESS", !and its file -262, !callee number -262,"SYS$VERIFY_PROXY",69, !its name 69,"SYSTEM" !and its file Again, the indentation is only to show the actions. You will see that the mod_nr and file_nr are specified twice If you had added a SKIPKEYS, the display would have been $ DIX/FILE/COUNT=1/CSV=HEADER name.CRF_CROSS/FOLLOW=(FIELD,skip) "CALLER_NR", "MOD_NAME","FILE_NR", "FILE_NAME", "CALLED_NR", "MOD_NAME","FILE_NR", "FILE_NAME" 738, !caller number "CHECK_ALLOWED_USER",66, !its name "REM_SERVER_CHECK_ACCESS", !and its file -262, !callee number "SYS$VERIFY_PROXY",69, !its name "SYSTEM" !and its file The display of the MOD_NR/FILE_NR for the second and third level files are now gone, since they are the key values
/FORMAT=(option,option...) /FORMAT=(DOT,ANSI) (Default) Normally all "character"-like fields will not contain unprintable data. These field types are CHARACTER,xSTRING. If the data does contain unprintables (hex 0:1f,7f,80:9f or ff, this includes the TAB character) the /FORMAT qualifier determines how this data should be displayed. Option can be DOT :All unprintables are replaced by a ".". This encoding is not reversible, after an unprintable value is replaced by a ".", DIX cannot know what the unprintable value was. This may be a problem in the screen mode. HEX :All unprintable data is displayed as %Xdd, a hexadecimal display. A % in the data will be displayed as %%. This display is reversible, so DIX can reconstruct the original unprintable value. If you are in this mode, on input a % must be entered as %% PASSALL:DIX will not change the unprintable data. The data is displayed as it is. This mode will not work in screen mode, and maybe poorly when the output device is a terminal. DUMP :Unprintable bytes are represented by a 2 or 3 letter mnemonic like <DEL> or <CR>. A < in the text will be displayed as <<. This display is reversible, so DIX can reconstruct the original unprintable value. If you are in this mode, on input a < must be entered as << ANSI :In combination with one of the first 4, allow ansi sequences to be printed SPECIAL:In combination with one of the first 4, allow BEEP (char(7)) and TAB (char(9)) to be printed
If the /HEX qualifier is given, the program will display the data in hexadecimal. In interpreted mode the CHARACTER*(*) fields will be dumped in ascending order separated by spaces. All other fields will be dumped in descending byte order (the OpenVMS standard). The default is /HEX in raw dump mode. The default is /DECIMAL in interpreted mode. See also the /HEX, /BINARY, /OCTAL and /RADIX qualifier. /HEX is a shortcut for /radix=16
Enters INTERACTIVE mode. This is a command line mode that allows you to enter commands at the prompt. This mode is useful for DCL procedures. See the INTERACTIVE_COMMANDS help for possible commands. This mode also supports scripting commands (IF, GOTO etc.). The /INTERACTIVE qualifier must be the first on the command line. Example: $ DIX/INTERACTIVE SYSUAF/EQ=SYSTEM Processing file: SYS$COMMON:[SYSEXE]SYSUAF.DAT;1/NOMOD Using description: DSA0:[PROGRAMS.DIX]DIX_DES.TLB;9(SYSUAF) DIX> disp *pwd* 340.0|UAF$Q_PWD(1) |22B619B5 344.0|UAF$Q_PWD(2) |E19FAE22 348.0|UAF$Q_PWD2(1) |00000000 352.0|UAF$Q_PWD2(2) |00000000 362.0|UAF$B_PWD_LENGTH |8 372.0|UAF$Q_PWD_LIFETIME|30 00:00:00.00 380.0|UAF$Q_PWD_DATE |17-MAY-2002 18:34:12.00 388.0|UAF$Q_PWD2_DATE |17-NOV-1858 00:00:00.00 DIX> EXIT You can type HELP at the prompt to obtain online help.
/KEYBOARD=value Define the input keyboard. Value can be Normal : The LK45X keyboard layout PC : The normal PC-type keyboard. Since the PC-keyboard misses some keys, those keys are redefined. This is visible in the help. f13..f20 are displayed as Shift-F3..Shift-f10 Find Home Select End Next_screen PageDown Prev_screen Pageup LAPTOP : The normal LAPTOP misses also the PF1-PF4 keys, they are redefined to ^F, ^G, ^K and ^L as well as the PC keyboard modifications. EXTENDED: Use extend input method for command input See the set terminal/exten for more info
Set limits to the records DIX will process from this file For indexed files /LIMIT=(value=end,key=nn) !limit to key value <=end /LIMIT=(value=(begin,end),key=nn) !limit to key values >=beg and <=end /LIMIT=(number,value=(begin,end),key=nn) !limit to record numbers !>=beg and <=end for key nn For non-indexed files or if you do not want to use key values but record numbers /LIMIT=(number,value=end) !limit to record number <=end /LIMIT=(number,value=(begin,end)) !limit to record number >=beg and <=end Limit the number of records searched. If /limit is not specified DIX will process all records of the file. If /LIMIT=VALUE=nnnnn the nnnnn is the last record number searched If /LIMIT=VALUE=(xyx,key) the xyz is the last key value processed Together with the /RECORD, you can search a part of the file The /COUNT qualifier limits the number of records printed. If the begin is set, DIX will position the file on the first record that satisfies the record/key value. If the end is set, DIX will issue a warning when the record number/keyvalue exceeds the value Example: $ DIX/FILE myfile.dat/limit=value=10 Will process records 1..10 of the file $ DIX/FILE myfile.dat/limit=value=(4,10) Will process records 4..10 of the file $ DIX/FILE myfile.dat/limit=(key=0,value=("A","B") ) Will process records with keyvalues >="A" and <="B" of the file
/LOCKING=(val,val...) Val can be RRL : Read all record with the RAB$M_RRL option. This means that even if the record is locked by another stream, DIX can read it. The usage is at your own risk, since any other user can modify the data you are looking at (and possibly change). OPTIMISTIC: DIX will read the record with the RAB$M_NLK option. The record is read, but not locked. Other streams can read the data. When you want to update a modified record, DIX will check if the record still contains the original data, and if not warn you, and give you the option to not modify the record. If the file is opened with /nomodify (Default) records will never be locked (the file is readonly).
If you leave the program DIX will define a symbol DIXRFA containing the filename and RFA of the current record. If you start DIX at a later moment with the same file and the /RFA qualifier, DIX will return to the same record as before. Example: $ DIX/INTER SYSUAF/EQ=SYSTEM DIX> EXA * ! Will display all data of the SYSTEM record DIX> READ ! Will read the next record from the SYSUAF DIX> Exit ! Leave DIX $ DIX/RFA SYSUAF ! Will return you to the record in SYSUAF following the SYSTEM record.
/MAX_BYTES=n Limit the read from the file to maximum 'n' bytes Example: DIX/FILE filename/max_bytes=10 Dump the first 10 bytes of all records in the file.
If the /MODIFY qualifier is specified, you are allowed to modify /delete/insert records, Either in interactive or screen mode, and in raw (DEP BYTE_OFFSET=VALUE) or description mode (DEP field_name=value). The /WRITE qualifier is a synonym for /MODIFY
/MOUSE (Default) /NOMOUSE Enable the usage of the mouse in screen (SMG) mode. By default mouse_usage is enabled, but if you want, you can disable it to allow the mouse for selecting text. In the interactive mode the mouse usage can be enabled/disabled via the set mouse command.
Normally DIX will open only one file. If you specify more than one file (via wildcard or list), the program will prompt you which file to use. If you specify /MULTI_FILE, DIX will open all files and lets you switch between them. If you specify DIX/FILE, multi_file is the default.
/[no]OFFSET /OFFSET=DECIMAL Default /OFFSET=HEX /OFFSET=BINARY /OFFSET=DECIMAL If the /NOOFFSET qualifier is given, the program will not display the byte offsets of the data. The default is /OFFSET(=decimal)
If the /OCTAL qualifier is given, the program will display the data in octal. The default is /HEX in raw dump mode. The default is /DECIMAL in interpreted mode. See also the /HEX, /DECIMAL and /BINARY and /RADIX qualifier. /OCTAL is a shortcut for /radix=8
/OUTPUT=Filename Give an alternative output file. This qualifier will only be used if you specify the /FILE qualifier. The default is the terminal. If you specified /WIDE the width will be 132. If you specified /WIDTH=nn, the width will be nn (up to 4095)
/RADIX=nn (nn=2..36) Display/modify data in any radix. This is the general case of /hex, /decimal, /octal and /binary
If DIX can find a description, DIX will use it. If you specify /RAW DIX will display in RAW mode even if it can find a description.
/RFA=(rfaval) Can be used to select a specific record by RFA rfaval is either a 3 16bits number value (like dump) bucketnrl,bucketnrh,offset or a 32 bits bucketnr, followed by a 16bit offset Example: $ DIX FILE.DAT/RFA=(100,12) !Bucket=100, offset=12 $ DIX FILE.DAT/RFA=(100,3,12) !Bucket=3*65536+100, offset=12
/SCREEN If the /SCREEN qualifier is given, the program will display a record, (either interpreted or raw) and lets you specify editing (only in /MODIFY mode) or display commands. You can 1. Alter display formats (raw/interpreted) 2. Modify description files 3. Create description files 4. Modify/insert/delete records (only in modify mode) Press the PF2/HELP key for info in screen mode. The /SCREEN qualifier must be the first on the command line.
/SCRIPT=filename If interactive mode, if you enter /script=file, DIX will take commands from that file (default file type is .DIX), and return to DCL. See also the /define qualifier and the /command qualifier If you are in dcl_compat mode, the default file type is .COM You can also execute a script via the @filename on the command line $ DIX/INT @filename ...
/SELECT=(name[,name...]) In the /FILE mode, DIX will print all fields (of all descriptions) to a file. If you specify /SELECT, DIX will display only fields with a name that matches one of the name(s) of the /SELECT. Wildcards (* and %) can be used. The value is [filemask\][descriptionmask\]fieldmask. If only one \ is found, it is the descriptionmask, and the filemask is *\ . If no description mask is given, all description (for the current file) are used. There is one special name $LINE : This will display the whole record as a single line, as if a description with one line "CHARACTER*32767 LINE" has been given. Examples: $ DIX/FILE SYSUAF/EQ=SYSTEM ! Will display all the known fields. $ DIX/FILE SYSUAF/EQ=SYSTEM/SELEC=*PWD* ! Will display only the fields with PWD in the name. $ DIX/FILE SYSUAF/EQ=SYSTEM/SELEC=UAF$P* ! Will display only the fields beginning with UAF$P $ DIX/FILE SYSUAF/des=(sysuaf,special) - /EQ=SYSTEM/SELEC=(SYS*\UAF$P*,SPE*\TEMP*) ! Will display only the fields that match UAF$P* in the description SYSUAF or TEMP* in the description SPECIAL $ DIX/FILE SYSUAF/des=(sysuaf,special) - /EQ=SYSTEM/SELEC=(TEMP*) ! Will display only the fields that match TEMP* in the description SYSUAF or TEMP* in the description SPECIAL $ DIX/FILE SYSUAF /select=$LINE. ! !Display each record with a single description "CHARACTER*32767" $ DIX/FILE a*.dat/MULTI/sel=(ax*\*\field1,ay*\*\field2) ! Dump all files a*.dat. For the ax*.dat files all field1 fields are displayed, and for the ay*.dat the field2 fields. All other fields (also in other files) are NOT displayed. The select is case insensitive.
/SHARED (Default in DIX mode) /NOSHARED (Default in DCL mode) Open the file share or not shared.
/STARTUP=filename /STARTUP=DIX_INI (Default) Process commands from a startup file. The default filename is SYS$LOGIN:.INI See the topic about the interactive_commands about allowed commands. If the qualifier is defaulted, a missing file (SYS$LOGIN:DIX_INI.INI) will not be signaled. If you specify /startup explicitly, the file must exist.
/STRICT=(mode[,...]) Sets the STRICT mode for DIX for this level. Deeper levels inherit the strict mode from the outer levels. Normally DIX is not very strict in the symbol handling. You can define new symbols by typing 1. a=10 (define the symbol a, type integer, value 10) and then say 2. a="SKLFG" (redefine a to type character, value "SKLFG" TYPING : Once a symbol is created, you cannot change the type anymore In the example above you can do 1. but not 2. DECLARATION : All symbols have to be declared before usage This also disallows calling subroutines or @ files and not having the same number of arguments given and declared. LOCAL : Even with /DECLARATION, symbols from an outer level can be used. With /LOCAL this is not allowed.
/SYMBOL=symbolname If you specify /SYMBOL and DIX operates in /FILE mode, the result is printed to the output file, and symbols are defined for each fieldname. for example $ DIX/FILE sysuaf/eq=system/select=*pwd*/symb=test will display %Recordsize = 644 340.0|UAF$Q_PWD(1) |22B619B5 344.0|UAF$Q_PWD(2) |E19FAE22 348.0|UAF$Q_PWD2(1) |00000000 352.0|UAF$Q_PWD2(2) |00000000 362.0|UAF$B_PWD_LENGTH |8 372.0|UAF$Q_PWD_LIFETIME |30 00:00:00.00 380.0|UAF$Q_PWD_DATE |17-MAY-2002 18:34:12.00 388.0|UAF$Q_PWD2_DATE |17-NOV-1858 00:00:00.00 But also the following symbols will be set $ show symbol test* TESTUAF$B_PWD_LENGTH = "8" TESTUAF$Q_PWD(1) = "22B619B5" TESTUAF$Q_PWD(2) = "E19FAE22" TESTUAF$Q_PWD2(1) = "00000000" TESTUAF$Q_PWD2(2) = "00000000" TESTUAF$Q_PWD2_DATE = "17-NOV-1858 00:00:00.00" TESTUAF$Q_PWD_DATE = "17-MAY-2002 18:34:12.00" TESTUAF$Q_PWD_LIFETIME = "30 00:00:00.00" This makes it easy to use DIX in command procedures.
/USER_LIBRARY=usertlbfile /USER_LIBRARY=DIX_DES_USER (Default) If you specify /USER_LIBRARY (Default), DIX will use this .TLB file for extra description records. The default file specification is SYS$LOGIN:.TLB So if you place a DIX_DES_USER.TLB in your login directory, DIX can it. In this file you can store your own descriptions, if you do not have write access to the default DIX_DES.TLB file.
/SYSTEM_LIBRARY=systemtlbfile /SYSTEM_LIBRARY=DIX_DES (Default) If you specify /SYSTEM_LIBRARY (Default), DIX will use this .TLB file for system-wide description records. The default file specification is DIX-image-directory:.TLB If you want to add your own descriptions, you may add them in this file, or (if you do not have write access to this file) in the DIX_DES_USER.TLB file. See the help about [DIX/HELP] "/USER_LIBRARY".
Set the output width (/INFO and /FILE) to 132. This is a shorthand for /WIDTH=132.
/WIDTH=nn Set the output width (/INFO and /FILE) to nn nn will be clipped between minimum 80 and maximum 4095.
If the /WRITE qualifier is specified, you are allowed to modify /delete/insert records, Either in interactive or screen mode, and in raw (DEP BYTE_OFFSET=VALUE) or description mode (DEP field_name=value). The /WRITE qualifier is a synonym for /MODIFY
If you specify /INTERACTIVE the program will enter command line mode. It will prompt you for commands. Lines can be continued with a - on the last position of the line (like DCL). The only exception is the variable-- command, so if you want a continuation line ending on a -(minus) be sure to add a space between the two -'s a=a - - (mind the space between the -'s) will be a=a-10 10 versus a -- will be a-- Blanks are not significant, except in symbol names, verbs and strings. DIX is by default not case sensitive, except within strings. DIX can be set to case_sensitive mode, see the help about "set case" DIX has a powerful set of commands to enable scripting inside a command file. See the @file_and_commands_in_file help topic. You can make a one-line command list. To do this you must start the command with PIPE or a ; and separate the commands with a ; Example: DIX> PIPE for k=1,10 ; evalu k ; endfor will create pseudo-command file containing for k=1,10 evalu k endfor DIX> ; for k=1,10 ; evalu k ; endfor !alternative version And execute it. In this way you can use the 'file_commands' on the command line If DCL mode enabled, DIX expects each line to start with a $ (all others are data lines). To help you in DCL mode DIX will automatically insert a $ before each line, unless the first line starts with a $. In that case DIX will assume you understand the need for leading $. Example (in DCL mode): DIX> ;show time;show time;show time DIX will insert a dollar before each line DIX> ;$type sys$input;line1;line2;$show time Since the first line starts with a $, DIX assumes you understand the need for a $ before each command. Line2 and line3 will be regarded as data for the type command. If you enter a command without a verb, DIX will try to evaluate the line as an expression and print the result, so an input like DIX> 10*10 !will give the answer 100 !just as if you had typed DIX> eval 10*10 If you enable check_symbol DIX will check for default extra settings for a command. So DIX> dire !will do a normal directory $dix_command_directory="/size" DIX> enable check_symbol DIX> dire ... !will do a directory/size ... The symbol is DIX_SYMBOL_COMMANDNAME, where commandname is the fully specified command (so directory and not dire)
Normally DIX will print the output of the commands to the terminal (or the filename given with @command/out=filename) Some commands (the ones with possibly a lot of output) accept the /OUTPUT=filename qualifier : Output to a file /PAGE qualifier : Output per page /SCREEN qualifier : Get all output first and then let you look at it in a window. If the output filename is preceded by a # or DCL: or DCL::, DIX will take the rest of the filename as a symbol name, and store results in (DCL_) symbols name,name_1,name_2...name_n. The symbol name_cnt will be filled with the highest index (might be 0) In this way you can use DIX to define DCL symbols, e.g. after $ DIX/COMM/OUT=dcl:abc say 4+5 the DCL symbol ABC will be defined with the value 9 DCL:: will define global symbols, and DCL: local ones Example: DIX> dir/out=dcl:tmp.tmp ; DIX> open lun dcl:tmp.tmp ; DIX> proces data DIX> close lun [/dispose=delete] Or DIX> type mem:tmp.tmp If the output filename is preceded by MEM:, the output is stored in a memory table. I.e. DIX> dir/out=mem:tmp.tmp ; DIX> open lun mem:tmp.tmp ; DIX> proces data DIX> close lun [/dispose=delete] The output files generated via the mem: and dcl: will be treated as files, so you can also do a directory mem:*. These 'files' can also be deleted. The names may contain letters, digits and ., but the first character must be a letter The 'device'names mem: and dcl: can be shown and changed via the set/show extra_devices For all commands you can redirect the output to a (one dimensional) DIX_symbol via the "symbolname < command" syntax You may also use the < syntax to get a count of lines/words/chars the output has generated, if you precede the symbolname with a # (or specifying only a #), see the examples below Example: !default to screen DIX> SHOW SYMBOL %OVERFLOW=False $STATUS=00000001 $SEVERITY=1 $DESCRIPTION="" $FILE="" $NRARGS=0 DIX> test<show symbol !Output to symbol testno output DIX> Show symb/all test !show the symbol (contains 6 lines) TEST(1)="%OVERFLOW=False" TEST(2)="$STATUS=00000001" TEST(3)="$SEVERITY=1" TEST(4)="$DESCRIPTION=""" TEST(5)="$FILE=""" TEST(6)="$NRARGS=0" DIX> #<show symbol !example of counting %OVERFLOW=False !the normal output $STATUS=00000001 $SEVERITY=1 $DESCRIPTION="" $FILE="" $NRARGS=0 TEST= table(6) 7 lines, 7 partial lines, 7 words, 88 characters printed !and the counters DIX> #test<show symbol !example of counting/symbol output 7 lines, 7 partial lines, 7 words, 88 characters printed DIX> !no output, except for count line DIX> show symb test TEST= table(7) !test is a table of 7 elements Example for output file specifications: DIX> show symbols/out=tst.dat !output to the file test.dat DIX> show symbols/out=#abc !output to ABC, ABC_1, ABS_2... DIX> show symbols/out=mem:name !output to memory file name DIX> show symbols/out=dcl:name !output to DCL symbol 'file' name $ DIX/COMMAND show symbols/out=dcl:name !output to DCL symbol 'file' name $ show symbol name* !and on DCL level the symbols are there NAME_1 = "$ARCHITECTURE="ALPHA"" NAME_2 = "$DESCRIPTION=""" NAME_3 = "$DIX_VERSION="8.6"" NAME_4 = "$FILE=""" NAME_5 = "$NRARGS=0" NAME_6 = "$SEVERITY=1" NAME_7 = "$STATUS=00000001" NAME_8 = "%OVERFLOW=False" NAME_CNT = "8"
Format @filename[/output=filename][/[no]verb[=readin]][/usage]- [/dcl_compatible[=value]]- [/verify] - [/password=pwd] - [expression[,expression...] Take the commands from a command file. The default filespec is 'this_directory'.DIX, or .COM if in DCL compatible mode. The expressions will be available in the subroutine as local symbols with the names Pn (As DCL) or any name the ENTRY statement gives them. There is no limit to the number of arguments. There is also a symbol $NRARGS that contains the number of arguments. See also the help about the ENTRY command. The /[no]verbs decides if verb symbol substitution is ON or OFF for commands in the file (default is OFF). The OFF mode allows DIX to precompile all statements in the file, make execution a lot faster. The ON mode disables the precompile mode, because DIX does not know if the verb may have been changed (i.e. like dir*ectory = "dir/col=1") See also the help about compiler hints. If you specify /verb=readin, the verbs will be translated on reading the command file, but not again on execution of the statements. In this way you can use global symbols for your verbs, but you cannot change the verbs in the command file. The /usage will display a control-t like line after execution of each command. If the user had set the statistics to /usage DIX will output a line for the usage data after execution of the command file The /[NO]DCL_compatible decides if the command file is executed in DCL mode If not specified, DIX uses the current setting for DCL_COMPAT set dcl_compat compatible set dcl_compat fallback /dcl_compatible=none No DCL functionality /dcl_compatible=compatible Support for leading $, replace .xx. by =<> /dcl_compatible=fallback Compatible + Unknown DIX verbs will be spawned to DCL The file is read into memory before any statement is executed. At this point all loop-structures are checked for correct overlap, so FOR IF ENDFOR ENDIF is not accepted. During this phase DIX will pre-compile all statements in the file (if verb substitution is OFF for command procedures). See the remarks about /verb above. Also Verb symbol-substitution for loop control verbs like IF, LOOP, [END]FOR, [END]WHILE, etc. is NOT supported. Loop commands can also be entered in terminal input mode (so not in a command file). DIX will prompt you to enter more command lines until the END statement is found, and them execute this set of commands. (This happens as if the commands had been entered in a command procedure so the command level will be one higher. This may affect symbols.) Support is for the IF, LOOP, SWITCH, REPEAT, and WHILE statement. Inside a command file you can use the following extra commands. If the file is a compiled file (via the compile command) and contains a password, you can (but maybe should not) specify the password via the /password= qualifier. If you do not specify it you will be prompted for the password.
You can give hints to the parser/compiler Hints may be abbreviated, as long as they are unique At this moments 2 hints are defined On starting a command procedure you can specify the /verb qualifier This qualifier sets the initial setting for the verb substitution. If verb substitution is ON, DIX cannot precompile command since the verb symbol may be set somewhere in the procedure. In the procedure you can switch this behaviour. ##VERB_SUBSTITUTION : From now on verb substitution is possible, so precompilation is disabled ##NOVERB_SUBSTITUTION : From now on verb substitution is not possible so precompilation is enabled This allows DIX to precompile all statements except those between the ##VERB and the ##NOVERB Example: dir1:=dir/date !set a symbol for dir1 k=1 ! gosub werk set stri/typ/decl ##verb !the next statements will not be precompiled !since the verb dir1 does not exist dir1 *.com; !parse at run time to use dir1 ##NOverb !From now on statements can be precompiled again bla: integer a=10 a=20
Call label [expression[,expression...] Call to a subroutine with optional parameters There is no limit to the number of arguments. See help about SUBROUTINE statement The parameters will be local symbols for the SUBROUTINE, see the help about [DIX/HELP] interactive symbols.
DECK [/DOLLARS=string] [/SYMBOL_SUBSTITUTION[=keyword]] The DECK statement is meant to allow user data to be inside a command procedure (see the DCL help about DECK) the /DOLLARS specifies a string used to signal the end of the data The default is /dollars=EOD. The match IS case-sensitive, so if you want a lowercase string, include the string within "". If /SYMBOL_SUBSTITUTION is set, DIX will try to substitute all strings between ''s. This allows you to use data lines and still have symbol substitution. See example below Symbol_substitution is strict or lax (see enable lax_quotes) The default is the current lax setting (DCL mode automatically enables LAX), but may be overruled by /SYMBOL=STRICT Use strict quotes, all quotes must in pairs /SYMBOL=LAX Use lax quotes (the first non letter/digit stops the symbol) DIX can operate in 2 modes DCL_COMPAT : The data is ended by a statement starting with a $. This may be the EOD command. In this mode, all lines not starting with a $ will be regarded as data (like DCL, so the DECK statement is not needed. Normal : The data is ended by the DOLLARS string Since DIX cannot distinguish between data and commands (no leading $), you must use the DECK statement.
Example for DCL mode (leading $ required, so DECK is optional): $type sys$input ! example with no deck and no EOD line 1 ! 3 data lines line 2 line 3 $exit $type sys$input ! example with deck and eod $deck ! Using the $DECK line 1 ! 2 data lines line 2 $eod ! It stops here Example for DIX mode, DECK statement required: type sys$input ! example with explicit /dollars deck/dollars=test ! the test will be uppercased by DIX line 1 ! 2 data line line 2 TEST ! The terminator exit ! Exit type sys$input ! example with implicit dollars (EOD) deck ! so we stop with a line containing EOD line 1 nodol ! 2 data lines line 2 nodol EOD ! The terminator Example with /symbol_substitution, the examples are for DIX mode: type sys$input deck ! without symbol substitution line 1 nodol 'a' ! 2 data lines line 2 nodol 'a+1' EOD ! Terminator This will return: line 1 nodol 'a' line 2 nodol 'a+1' a=10 type sys$input deck/symbol ! with symbol substitution line 1 nodol 'a+2' line 2 nodol 'a+3' EOD This will return: line 1 nodol 12 line 2 nodol 13 For DCL mode the example is the same, but in this case the $DECK is necessary, since that is the statement with the /symbol $a=10 $type sys$input $deck/symbol ! with symbol substitution line 1 nodol 'a+2' line 2 nodol 'a+3' $EOD Read the description inline from the command file OPEN name filename/des=sys$input DECK description text EOD
ENTRY parametername[qualifiers][,parametername[qualifiers]...] Declare names for parameters on @ed files. must be the first command in the file If a call is make to a command file, the (optional) parameters are evaluated, and the resulting value is placed in the (local) symbol with the name "parametername" or Pn if there are more parameters than parameternames. Qualifiers can be /REAL You may specify the size of the real with the /SIZE=4,8,16 /[U]INTEGER /CHARACTER /DATE /DECIMAL /LOGICAL The expression given at the @ line must match the type given to this symbol /SYMBOL If the parametername has a /SYMBOL qualifier, the parameter will be an alias to the original expression parameter. If you use the /SYMBOL the caller must be a symbol or any subset (except indexed symbols). If you change the parameter the changes will be done to the caller symbol. This is a way to let the @file return output values. If you use /SYMBOL and the parameter is an indexed symbol, you may only use the whole symbol, not a subset. If DIX is in STRICT/DECLARATIONS mode, the number of defined and actual parameters must be equal, and all parameternames must have a type. Example: integer x=10 @mysub 10*4,"Text",x,41 and the file mysub.DIX contains the following lines entry count/integer,name,xparam/symbol ... ... exit In the file "mysub" there will be 5 symbols defined COUNT : Integer with the value 40 (the expression MUST be integer). NAME : Character with the value "Text" XPARAM : Integer with the value 10, is an alias for to symbol x. and modifications are done to the X symbol of the caller P4 : integer with the value 41 $NRARGS: Integer with the value 4 (4 arguments) If there are more parameternames than parameters, the parametername will be defined as a character string with the value "" (empty). If there are more parameters than parameternames, the symbols P* are defined with the same type as the parameter. Both possibilities are not allowed with the STRICT/DECLARATION mode. Examples: Example for a subsetted table: DIX> INTEGER val(10,2) DIX> @tt: val(1,*) DIX_1> ENTRY MYVAL/symbol DIX_1> show symbol myval/fu MYVAL(Fixed,Integer,Level=2.0,alias->VAL)=table(2) DIX_1> say myval [0,0] DIX_1> myval(2)=12 DIX_1> exit DIX> say val [[0,0,0,0,0,0,0,0,0,0][12,0,0,0,0,0,0,0,0,0]] Example for a structured type: DIX> load/structure def_main.struct !load the structure DIX> sh struc/fu def_main !what does it look like DEF_MAIN, level 1 ! File USER50:[STUBBF.PROGRAMS.DIX.SOURCE]DEF_MAIN.STRUCT;2 INTEGER*4 INDEX CHARACTER*40 MYSTR REAL_X*16 REAL16VAL INTEGER*4 EXTRA_INT INTEGER*4 EXTRA2(2,3) DIX> decl/stru=def_main val !declare a symbol of this type DIX> say val !normal evaluate, only values [0,,0.0,0,[[0,0][0,0][0,0]]] DIX> @tt: val.extra2(2,*) !call a subroutine DIX_1> entry locval/symbol !declare a local value as alias DIX_1> show symbol locval/fu !is now a table of elements LOCVAL(Fixed,Integer,Level=2.0,alias->VAL)=table(3) !extra(2,1),(2,2),(2,3) DIX_1> say locval [0,0,0] DIX_1> locval(3)=31 !set the 3 (=(2,3)) to 31 DIX_1> exit DIX> say val [0,,0.0,0,[[0,0][0,0][0,31]]] !et voila
Syntax: Goto Label Goto the line with this label. If the label cannot be found, DIX will close this command file (and possibly its parent) until the input comes from a terminal or (in BATCH) exit DIX. The label must be visible from the current context level, so for example "LAB" will not be found, because "LAB" is in the repeat/until structure, and you cannot jump into a loop structure. x=1 repeat lab : x=x+1 until x>5 goto lab
Syntax: GOSUB label Goto the line with this label. If the label cannot be found, DIX will signal an error. Depending on the current ON state DIX may continue or close the command file. The return address will be stacked, and the RETURN command returns you to the next line. The label must be visible from the current context level, so for example "LAB" will not be found, because "LAB" is in the repeat/until structure, and you cannot jump into a loop structure. x=1 repeat lab : x=x+1 until x>5 gosub lab
Each line can be preceded by a label. The label can be any string terminated by a : Label names are not case-sensitive and can have up to 32 characters. All the character must be a-z 0-9 $ or _. Example: This_label12 : statement
On option [then] command The then is optional Option can be Warning Error Severe Control_c overflow And can be abbreviated to one letter For the message levels: If an error occurs, DIX will execute 'command' for the error level or a lower level. Example: ON error goto label_error. Any error and severe will jump to label_error. Warnings will be ignored. on overflow say "got overflow" !say "got Overflow" if it is found on control_c then debug !Jump to the debugger if you hit a ^c
Will return from a previous GOSUB. Return without an open GOSUB is NOT signaled as an error. DCL does not signal it, and so does DIX.
Format label: SUBROUTINE [parametername[/qualifiers][,parametername[/qualifiers]...]] Defines the beginning of a subroutine in a command procedure. The SUBROUTINE command must be the first executable statement in a subroutine. The subroutine must be terminated with an ENDSUBROUTINE. If a call is make to a subroutine, the (optional) parameters are evaluated, and the resulting value is placed in the (local) symbol with the name "parametername" or Pn if there are more parameters than parameternames. Qualifiers can be /REAL You may specify the size of the real with the /SIZE=4,8,16 /[U]INTEGER /DATE /DECIMAL /CHARACTER /LOGICAL The expression given at the @ line must match the type given to this symbol /SYMBOL If the parametername has a /SYMBOL qualifier, the parameter will be an alias to the original expression parameter. If you use the /SYMBOL the caller must be a symbol or an scalar element of a symbol. If you change the parameter, the changes will be done to the caller symbol. This is a way to let the SUBROUTINE return output values. If DIX is in STRICT/DECLARATIONS mode, the number of defined and actual parameters must be equal. Example: integer x=10 Call mysub 10*4,"Text",x,4 mysub: subroutine count,name/character,xparam/symbol ... ... endsubroutine In the subroutine "mysub" there will be 5 symbols defined COUNT : Integer with the value 40 NAME : Character with the value "Text" (must be a character expression) XPARAM : Integer with the value 10, is an alias for the symbol X, and so modifications are done to the X symbol of the caller P4 : Integer with the value 4 $NRARGS: Integer with the value 4 (4 arguments) If there are more parameternames than parameters, the parametername will be defined as a character string with the value "" (empty). If there are more parameters than parameternames, the symbols P* are defined with the same type as the parameter. Both possibilities are not allowed with the STRICT/DECLARATION mode.
k = 1 !define symbol k value 1 Loop: k = k + 1 !label + increment of symbol Examine field_'k' !exam with symbol substitution If (2*(k+10) < 20) goto loop !test for repeat This following script will increment BYTLM by 1000 for all users with a name that matches *A*, and have a BYTLM of >=50000 and a JTQUOTA >4000 (maybe not a very useful example, but is shows the possibilities) nmod = 0 nfnd = 0 on error goto done loop: nfnd = nfnd + 1 if (f$matchwild(uaf$t_username,"*A*")) goto next echo "Found user ''uaf$t_username'" if (uaf$l_bytlm < 50000 | uaf$l_jtquota <= 4000 ) goto next deposit uaf$l_bytlm='uaf$l_bytlm + 1000' nmod = nmod + 1 update/quiet echo "Updated ''uaf$t_username' to ''uaf$l_bytlm'" next: read goto loop done: echo "Found ''nfnd' users, modified ''nmod' users"
DIX has a syntax very similar to DCL. If you want to be able to use DCL command files, DIX has to be put in dcl_compat mode. DIX will then remove leading $'s, and if in fallback mode it will spawn commands that are not recognized by DIX. You can set/clear dcl_compat mode via the SET DCL none|compatible|fallback Or via: @procedure/dcl[=fallback] You cannot change the dcl_compat mode within one procedure. There are 2 levels of dcl_compat mode compatibility : -leading $'s are removed before parsing -the DECK statement behaves DCL-like -.lt., .ge. etc. are replaced by the DIX counterparts < > etc. fallback : -If a command fails to be parsed by DIX (IVVERB) DIX will spawn the command line. Be aware that spawning is not the same as execution under DCL and that DIX symbols are not DCL symbols, but maybe the spawn will do what you want.
DIX has a built-in debugger for the debugging of command-scripts You start this by @procedure/debug You can set/delete break and watchpoints You can step [/into] and go You can also specify most of the interactive DIX commands to examine/modify symbols/fields etc. The statement breakpoint in a command procedure will also activate the debugger By default the following keys are defined KP5 : Show calls PF1-KP5 : Show call /full KP0 : Step PF1-KP0 : Step/into And you may define more via the def/key command. You can also store commands in a file and execute the file via @file (default filespec .DIX;), the @commands can be nested 10 deep. Verb substitution is also active (if you have in enabled, this is the default) DixDbg> sb:=show break DixDbg> sb !will show the current breakpoints
Each command procedure has a level DIX> @first ! level 2 (the DIX> prompt is level 1) if there is a @ line in first[.dix] that procedure will be at level 3 Since DIX is an interpreter, DIX does not know anything about deeper levels until the @ is reached. So if you are on level 2, you cannot specify breakpoints on deeper levels On some commands you can specify lines/labels on lower levels via the level\line or the level\label syntax
cancel break cancel watch cancel trace
cancel a breakpoint cancel break/all Cancel all breakpoints cancel break line [level\]nn Cancel Break on line number cancel break label [level\]labelname Cancel Break on a label cancel break call Cancel Break on call cancel break return Cancel Break on return cancel break message Cancel Break on error level
cancel a tracepoint CANCEL TRACE/ALL Cancel all tracepoints CANCEL TRACE LINE [LEVEL\]NN Cancel trace on line number CANCEL TRACE LABEL [LEVEL\]LABELNAME Cancel trace on a label CANCEL TRACE CALL Cancel trace on call CANCEL TRACE RETURN Cancel trace on return CANCEL TRACE MESSAGE Cancel trace on error level
cancel watch /all Cancel all watchpoints cancel watch name Cancel watchpoint "name" cancel the specified watchpoint Supported qualifiers /field Name is a fieldname, if /field is not specified, name is a symbol
Go [line][label] (re)start processing until a breakpoint occurs optionally a line or label may be specified. DIX will restart execution from that line line or label must be in the current level
help [token] Help about the debugger
Set some things set break set watch set trace
set watch name If the symbol/field matching name is touched or modified display the value (and the new if changed) Supported qualifiers /field Name is a fieldname, if /field is not specified, name is a symbol /reference If /reference is specified, DIX will also report references (not changes) If /reference is not specified, DIX will only report changes /break If the symbol/field is touched (with /refer) or modified DIX will enter the debugger Watchpoints support the following qualifiers /when="dix_command" If the watchpoint is reached, DIX will execute the code specified The result must be a logical. It the expression evaluates to true the watchpoint will be taken (but the /after must be satisfied too) /after=n Take the watchpoint after the 'n'th time. If both the /when and the /after are specified, DIX will evaluate the /when first, and if that succeeds, the /after is tested. /do="dix_command[;dix_command...]" When a watchpoint is found (after the /when and the /after are satisfied, DIX will execute the commands. All commands are executed, even if one of them is a "go" or a "step"
set break line [level\]nn Break on line number set break label [level\]labelname Break on a label set break call Break on call/gosub set break return Break on return/exit set break message severe|error|warning Break on error level set break instruction instructionname Break on a specific instruction Instruction names are the normal DIX command verbs, the @ command is named AT, and the assignment (a=10) as ASSIGN. Both nn and labelname may be prefixed by level\ to set breaks on lower levels Supported qualifiers /when="dix_command" If the breakpoint is reached, DIX will execute the code specified The result must be a logical. It the expression evaluates to true the breakpoint will be taken (but the /after must be satisfied too) /after=n Take the breakpoint after the 'n'th time. If both the /when and the /after are specified, DIX will evaluate the /when first, and if that succeeds, the /after is tested. /do="dix_command[;dix_command...]" When a breakpoint is found (after the /when and the /after are satisfied, DIX will execute the commands. All commands are executed, even if one of them is a "go" or a "step" /temporary Remove the breakpoint when it is reached
set trace line [level\]nn Trace on line number set trace label [level\]labelname Trace on a label set trace call Trace on call/gosub set trace return Trace on Exit/return set trace message severe|error|warning Trace on error level set trace instruction instructionname Trace on a specific instruction Instruction names are the normal DIX command verbs, the @ command is named AT, and the assignment (a=10) as ASSIGN. Both nn and labelname may be prefixed by level\ to set tracepoints on lower levels Supported qualifiers /when="dix_command" If the tracepoint is reached, DIX will execute the code specified The result must be a logical. It the expression evaluates to true the tracepoint will be taken (but the /after must be satisfied too) /after=n Take the tracepoint after the 'n'th time. If both the /when and the /after are specified, DIX will evaluate the /when first, and if that succeeds, the /after is tested. /do="dix_command[;dix_command...]" When a tracepoint is found (after the /when and the /after are satisfied, DIX will execute the commands. All commands are executed, even if one of them is a "go" or a "step" /temporary Remove the breakpoint when it is reached
show break Show breakpoints show trace Show tracepoints show watch Show watchpoints show calls Show call stack
Step[/into] [line][label] (re)start processing until the next line optionally a line or label may be specified. DIX will restart execution from that line line or label must be in the current level if the line is a @ line, DIX will not debug the deeper level unless the /into qualifier is specified
type Type the current line type nn Type line nn type nn:mm Type line nn:mm type * Type all lines type level\.. Type lines from lower levels If you specify /full DIX will also display the level and the command procedure.
ADD DESCRIPTION name[,name...] ADD VIEW name[,name...] ADD PARAMETER ADD VALUE ADD TYPE ADD SELECT_FILE Add new descriptions/views to the current file. See also the remove command. Add description mask Will add the descriptions matching mask to the current file Parameter/values are a special type of symbol By default parameter/type/value names are not case sensitive, unless DIX is put into case sensitive mode, see the help about "set case" Parameter, type and values can be defined GLOBAL (/global) or at a specified level via /LEVEL=n. n can be 1..current command level or -1..-n N levels up The default level is the current command level ADD PARAMETER name=value Cannot be changed ADD VALUE=value May be modified Types are used to specify enumeration types for symbols See also the help about [DIX/HELP] interactive declaration ADD TYPE name=value Example: DIX> Add type myvals="0=zero,1=one,10=big" !define a type to be used DIX> a=10 !add a new symbol DIX> Set symb a/type=#myvalues !add a fieldname list to the !symbol DIX> Evaluate a !Evaluate will not use fieldnames 10 DIX> show symb a !show symbol will use the A=big !fieldnames DIX> show symb/fu a !show all info about a A(Integer*4,Level=1.0)=big Type : #MYVALUE (0=zero,10=big)
syntax : Add select_file name [/qualifiers] Make a file selection symbol to be used with F$SEARCH, F$SELECT_FILE or the directory/select=select=name You can describe which attributes a file must have Example: DIX> Add sele big /selec=size=min=1000 !Create a selec mask for files bigger ! than 1000 blocks DIX> big_f = f$search("*.*",,,,,"big") !return the first file with size>=1000 DIX> say f$select("big_file.dat","big") !return true/false if file big_fil.dat !is bugger/smaller than 1000 blocks For more help see also the help about directory/select
Define the pattern in the global symbol table. By default the patterns is stored at the current command level.
/level=n Define the pattern in the command procedure level n. n can be 1,2,... Absolute level -1,-2 Lower levels
/select=(tag, tag..) Tag can be version=(min=nn,max=nn) !check file version number size=(min=nn,max=nn) !check file size (EOF) allsize=(min=nn,max=nn) !check file size (Allocated) headers=(min=nn,max=nn) !check number of file headers extents=(min=nn,max=nn) !check number of file extents acl.size=(min=nn,nax=nn) !check ACL size in bytes acl.count=(min=nn,max=nn) !check ACL count fileid=(min=nn,max=nn) !check fileid unused_size=nn !check unused size (between END_OF_FILE and allocated) by_owner=user !check on username organization=tag !check file organization tag can be seq,rel,idx,syml record_format=tag !check record format tag can be udf,fix,var,vfc,stream,stream_lf,stream_cr journal=tag !check journal files tag can be journal, aij,bij,ru flag=(tag) !check file flags tag can be nobackup,locked,nomovefile,wbcache,readverify, writeverify,directory,badacl,badblock,nocharge,erase
/UIC=UIC Add a UIC selection
/since=date Add a since date. See also the /created, /modified, /backup and /expired
/before=date Add a before date. See also the /created, /modified, /backup and /expired
The /since and/or /before are checked against the creation date
The /since and/or /before are checked against the modification date
The /since and/or /before are checked against the backup date
The /since and/or /before are checked against the expiration date
ANALYZE [/DISPLAY=(option,option..)] [/VERBOSE=n] option can be KEY=n : Analyze only key LEVEL=n : Analyze only key level 'n' LEVEL="+n" : Analyze only the top 'n' key levels LEVEL=-n : Analyze only the lowest '-n' key levels [NO]DATA : Analyze the data buckets too. Since this can take a lot of time, this is not the default. [NO]SIDR : Display the SIDR records, this is the default [NO]KEYBUCKETS : Display the key buckets records, this is the default DETAIL : The amount of detail 0..4 Be careful, this can generate a lot of output. OUTPUT=filename : If verbose is >0, the extra output can be redirected to another file. The normal output will be in the file specified with /OUTPUT=filename START=n : Start analysis at bucket 'n' in chain, default=0 (n may be negative, last but 'n' bucket of the chain) END=n : End analysis at bucket 'n' in chain, default is whole chain (n may be negative, last but 'n' bucket of the chain) VERBOSE=0 : Just the normal output VERBOSE=1 : Print out the buckets read VERBOSE=2 : Detail 1 and the bucket header info VERBOSE=3 : Detail 2 and SIDR records and the data records VERBOSE=4 : Detail 3 and the SIDR pointers If verbose>0, the output of the detail option can be redirected to another file. See the OUTPUT= option For more info see the help about [DIX/HELP] modes analyze ![DIX MODES analyze]DIX modes analyze
symbolname=value fieldname=value You can assign values to symbols or fieldnames Fieldnames can also be assigned via the deposit command There are also four special formats name++ name=name+1 name-- name=name-1 name+=n name=name+n name-=n name=name-n For these formats only [u]integer types (symbols or fields) are allowed In DCL compatible mode the symbol[d1,d2]=expression and :=expression are also supported for strings and integers (like DCL)
symbolname = value Symbol may be a table or a subset of a table. In this case value must either be a scalar or have the same shape as the symbol Examples: a=10 !scalar assignment decl a(3,3)/integer !declare an integer table(3,3) a(*,*) = 0 !all values(9) to 0 a(3,*) = 10 !all values(3,*) (3 of them) to 10 a(3,*) = [1,2,3] !fill a(3,*) with 1,2,3 respectively For indexed symbols you can also modify an existing entry or add a new one the indexed symbol declare/index=char test/int !create an indexed symbol test of type integer test("a")=1 !add a new element test("a")=2 !modify element "a" test("b")=4 !add a new element "b" test("c")=test("c") + 1 !update element "c" or create it if not yet present For description type symbols you may change all individual fields DIX> load/descr sys$input mydesc integer*4 testi real*4 testr character*20 testc ^Z %DIX-I-DESADD, Description sys$input:mydesc added DIX> show des/loaded mydesc Name : sys$input:mydesc Status : Fixed INTEGER*4 TESTI REAL_F*4 TESTR CHARACTER*20 TESTC No variable Data lines DIX> declare/des=mydesc mysymb DIX> show symb mysymb/fu/all MYSYMB(Descr=sys$input:mydesc,Level=1.0)=2 descriptions,2 expanded MYSYMB.TESTI=0 0 INTEGER*4 TESTI MYSYMB.TESTR=0.0 4 REAL_F*4 TESTR MYSYMB.TESTC= 8 CHARACTER*20 TESTC DIX> mysymb.testi = 12 DIX> mysymb.testc = "abcd" DIX> show symb mysymb/all MYSYMB.TESTI=0 MYSYMB.TESTR=0.0 MYSYMB.TESTC="abc" DIX> show symb mysymb.*i/all
fieldname=value Fieldname may be the name of one field, or an table Fieldname may not contain wildcards (Except in the final dimension) value must have the same shape as fieldname Examples: suppose we have a field test.value(2,2) somewhere test.value(1,1) = 10 !assign to value(1,1) test.value = 10 !assign 10 to all values (4 fields) test.value(1,*) = 10 !assign 10 to (1,*) (2 fields) The following is not supported Suppose we have a test(3).value(2,2) test(1).value(1,1) is valid, but test(*).value(1,1) not You may also assign values to fieldnames via the DEPOSIT command The differences are deposit allows wildcarding of the name (a text match is done) the text after the = is interpreted as text, and will be converted according the fieldname type. assign Does not allow wildcarding of the name, but it does support wildcarding in the lowest dimension The piece after the = is evaluated as an expression, and must deliver a result of the same (or compatible) type as the field
Syntax BACK [/LOG] This command allows you to return to the file from which you followed a link to this file. Up to 16 jumps are saved in a history buffer. See also the FOLLOW command
If the break command is found in a command file, DIX jumps to the DIX debugger. The command is ignored when issued from the terminal
CD[/log] [string] A fast way to change directories. You can also use the SET DEFAULT command, but CD is easier to use. SDF is a synonym for CD Syntax: CD token[.token[.token...] Token can be 1. The beginning of the directory or a complete device name. If the directory is not unique, DIX will print a list of directories, and lets you choose one. If token ends with a :, DIX will change the current disk to the token. 2. # : This is the SYS$LOGIN of the current user 3. ~username: The login directory of user 'username'. If username is not specified, the current user will be used, and it is equivalent to #. This may need GRPPRV or SYSPRV privilege 4. - Go one level up. If this is the last item on the line you must add a . to prevent DIX from asking for a continuation line. Instead of the . as separator, the / or the \ can also be used. If the / or the \ is typed as the first character, DIX will jump to the [000000] directory of the current disk. Examples: DIX> CD !display current directories Current directory:USER50:[STUBBF.PROGRAMS.DIX.SOURCE] Subdirectories found : DATA T4 TEST DIX> CD T !go to a directory starting with a T (there are 2) 1:T4 2:TEST !DIX will display all matches and ask you for a choice Choose 1..2:2 New directory:USER50:[STUBBF.PROGRAMS.DIX.SOURCE.TEST] DIX> cd -. !go one up again New directory:USER50:[STUBBF.PROGRAMS.DIX.SOURCE] DIX> CD ~ !go to my login directory is the same as CD # New directory:USER50:[STUBBF] DIX> CD P.D.S !I want to go back to programs.dix.source 1:PCSI 2:PERF 3:PROGRAMS Choose 1..3:3 !choose programs, and now we again have multiple matches 1:DELETE_INTRUSIONS 2:DISKSTAT 3:DISTRIBUTED 4:DIX Choose 1..4:4 !Choose DIX, and now there are no more ambiguous directories New directory:USER50:[STUBBF.PROGRAMS.DIX.SOURCE] DIX> CD ~OTHERUSER !goto login of otheruser (needs privileges) New directory:USER100:[OTHERUSER]
CHARACTER[/level=n][/global] name[dimensions][=value] CHARACTER name[=value] Declare a new symbol of type "CHARACTER" and optionally give a value. The value (if present) must be an expression of type "character" Example: CHARACTER mystring="Heading line" See the help about [DIX/HELP] interactive declaration
Compute sha* and md5 checksums of files or strings checksum/xor=[vms] parameter [/qualifiers] !compute xor hash checksum/sum parameter [/qualifiers] !compute sum hash checksum/md5 parameter [/qualifiers] !compute md5 hash checksum/sha=n parameter [/qualifiers] !compute sha hash ! n=1,224,256,384,512, default=256 DIX will compute the data only from the record contents (if not in block_mode) If you copy the file to i.e. windows, the checksum may be different. This has two possible reasons. a. For text files (ASCII transfer) the windows checksum utility checks all data in the file including the separating CRLFs. See the /add qualifier for a possible solution b. If you checksum a .ZIP file, RMS will read the file as 512 byte records but the last record may not be completely filled (END_OF_FILE in the middle of the block). Use the /exact_file_size qualifier for a solution. The same applies if you checksum the file in block mode. For the sum and xor checksum you can specify the /byte,/word and /longword qualifier to select the size of the xor/sum value. The default size is longword. If the size in /word or /long, and the record does not contain a multiple of bytes (2 or 4), the record will be appended by binary 0. If the user specifies /xor=vms, the last bytes will be added instead the appending with binary 0. This matches the OpenVMS checksum/algor=xor method. Parameter is a filename to checksum or a string (if /string is specified) Qualifiers
The parameter is a string and not a filename.
/symbol[=name] Store result in a DIX symbol "name". The default value is CHECKSUM$CHECKSUM If you also specify /dcl, the result will be in a DCL symbol If you are running in command mode (DIX/COMMAND), /DCL is default
If /symbol is specified, the result must be in a DCL symbol If you are running in command mode (DIX/COMMAND), /DCL is default
/logical[=name] Store result in a process logical. The default value is CHECKSUM$CHECKSUM
If /logical is specified, the logical will be stored in a job logical name table
/block_mode Open the file in blockmode, normally only records are processed In this case all bytes in the file are used, also the record separators. See also the /exact_file_size qualifier.
For the sum and xor checksum only. Set the size of the checksum to byte.
For the sum and xor checksum only. Set the size of the checksum to word (2 bytes).
For the sum and xor checksum only. Set the size of the checksum to longword (4 bytes).
/skip=tag Skip certain characters in input. Tag can be LF : Skip LF character CR : Skip LF character BOTH : Skip CR and LF character, this is the default /skip
/add=tag Add certain characters after each record. Tag can be LF : Add LF character CR : Add LF character BOTH : Add CR and LF character, this is the default /add
For fixed files only. The last record can have less than the fixed record length. RMS will always report the fixed record length. With this switch the checksum will only be computed on the real file size. This may/will be useful for .ZIP files
CHKA Check access to files Syntax : CHKA filename user /qualifiers Check if user has access to the file(s). If no access is possible, DIX will check upper directories until access is possible. CHKA will show the ACL or privilege used to access the file If no ACL or privilege is shown, access will be via ownership/fileprotection You need privileges (SYSPRV or BYPASS) if you want to query for anybody but yourself Parameters filename : The file to check User : The user to check for Qualifiers Access qualifiers /read : See if read access is possible /write : See if write access is possible /update : See if update access is possible /delete : See if delete access is possible the /read is default, and only one access qualifier may be used Other qualifiers /defpriv : The default user privileges instead of the authorized /batch : See is access in batch is allowed /all_level: Print access of all upper directories /ids=(id,id..) : Extra identifiers to grant to the user (so i.e. /batch is the same as /ids=batch) Examples: User STUBBF has SYSPRV in authorized, but not in default privileges DIX> chka sys$system:zic.exe !Read access to zic.exe? R access to SYS$COMMON:[SYSEXE]ZIC.EXE;1 DIX> chka sys$system:zic.exe /write !write access to zic.exe? W access to SYS$COMMON:[SYSEXE]ZIC.EXE;1 because priv SYSPRV DIX> chka sys$system:zic.exe /write/defp !write access to zic.exe with default privileges? NO W access to SYS$COMMON:[SYSEXE]ZIC.EXE;1 NO W access to DISK$ALPHASYS:[VMS$COMMON]SYSEXE.DIR;1 E access to DISK$ALPHASYS:[000000]VMS$COMMON.DIR;1 %SYSTEM-F-NOPRIV, insufficient privilege or object protection violation If ACLS are present like on test.dix. User TEST has no extra privileges. $ DIR/SEC TEST.DIX TEST.DIX;13 [STUBBF] (RWED,RWED,RE,) (IDENTIFIER=[TEST],ACCESS=WRITE) DIX> chka TEST.dix test !user test has no read access NO R access to USER50:[STUBBF.PROGRAMS.DIX.SOURCE]TEST.DIX;1 E access to DISK$ALPHASYS:[STUBBF.PROGRAMS.DIX]SOURCE.DIR;1 %SYSTEM-F-NOPRIV, insufficient privilege or object protection violation DIX> chka test.dix test/write !user test has write access by ACL W access to USER50:[STUBBF.PROGRAMS.DIX.SOURCE]TEST.DIX;1 Because of ACL (IDENTIFIER=[TEST],ACCESS=WRITE)
CLOSE[/qualifiers] Close the current file CLOSE[/qualifiers] mask Close file with tag=mask or filename matches mask Mask can contain wildcards Will close the file(s) that match 'mask'. If the current file is closed the first file in the list will become the current file.
/DISPOSITION=what What to with the file when it's closed what can be KEEP : This is the default, do nothing SUBMIT : Submit the file to SYS$BATCH PRINT : Print the file to SYS$PRINT DELETE : Delete the file Only supported for RMS files, no Fast I/O or library module
/ERROR=label If the CLOSE results in an error, DIX will jump to the label. If the /ERROR qualifier is not specified, DIX will look for the ON condition.
/LOG /NOLOG (Default) If you specify /log, DIX will show the file(s) closed. Also the new current file is displayed (or the no files open message)
COMPILE dixfile [/qualifiers] Compile the DIX file to a compiled file. This may load a little faster, but runtime performance will be the same, since DIX precompiles all scripts. However using compiled scripts makes it (nearly) impossible for users to adapt the script, certainly if you do not specify /include and even more if you specify /encrypt Supported qualifiers /INCLUDE_SOURCE : Include the source of the script. This allows the user to display the lines during execution if SET VER is on /ENCRYPT : Encrypt the output file. This makes it very hard to change the commands. /OUTPUT=filename: The default filename is 'INPUTFILE'_COMPILED /LOG : Display logging info /COMPRESS : Compress the output file. This makes the file smaller. This is the default /PASSWORD=string: Add a password for the file. This will also set the ENCRYPT flag. On execution the user must specify the password. /DCL_COMPATIBLE[=compatible|fallback] : Set the DCL compatible mode The default is /NODCL, /DCL is /DCL=compatible /VERB[=none|always|reading] : Set the verb substitution The default is /NOVERB, /VERB is /DCL=always See the help about "intera file_and_commands_in_file" Example: DIX> compile script/log !compile script.dix to script.dix_compiled Compiled DISK:[DIR]SCRIPT.DIX/COMPRES;4 /output=DISK:[DIR]SCRIPT.DIX_COMPILED;2 20 records saved containing 3055 bytes DIX> @script.dix_compiled !execute compiled script .... DIX> Compile a.com/DCL !compile a DCL command file
Convert [/qualifiers] inputfile[,inputfile] outputfile Convert an input file to an output file. Just like DCL convert.
Controls whether converted records from an input file are appended to an existing sequential file. Normally DIX would create a new output file, but if you specify /append, DIX will append all records from inputfile to outputfile.
Specifies whether an exceptions file (file type .EXC) is to be generated during the conversion. Format /EXCEPTIONS_FILE [=filespec] /NOEXCEPTIONS_FILE (Default) Filespec is by default SYS$OUTPUT
Controls whether the DIX exits when it encounters an exception record. By default, DIX continues processing records when it encounters an exception record.
Specifies whether the DIX uses a fast-loading algorithm for indexed files. Format /FAST_LOAD (Default) /NOFAST_LOAD
Indicates that an FDL file is to be used in creating the output file. Format /FDL=fdlfile Specifies the FDL file to be used in creating the output file. The newly created output file will have the name specified by the fdlfile command parameter; this name overrides any file name specified in the FDL file. The default file type for the FDL file is .FDL. The FDL file can also be specified inline. If the first character of the FDL file is a ; DIX will treat the filespec as a (; separated) string that contains the FDL specifications. Example: DIX> convert/fdl=x a b Convert file a to b using FDL file x.fdl DIX> convert/fdl="; file ; org seq" a b Will convert file a to b as if an FDL file FILE ORG SEQ is given.
Controls whether to override the bucket fill percentage parameter associated with the output file. Format /FILL_BUCKETS /NOFILL_BUCKETS (Default) If you specify /FILL_BUCKETS, the DIX fills the output file buckets with as many records as possible. This option is valid only for indexed output files.
Controls file conversions between files having variable-length with fixed-length control field (VFC) records and files having other record formats. Format ED_CONTROL /NOFIXED_CONTROL (Default) This qualifier applies only to conversions where either the input or the output file, but not both, uses VFC records. This option is applicable only to sequential files. o If you specify /FIXED_CONTROL and the input file uses VFC records but the output file does not, the fixed-length control field from the input record is inserted into the output record as data. o If you specify /FIXED_CONTROL and the output file has VFC records but the input file does not, the leading part of the input record is used to fill the fixed-length control part of the output record. o If you specify /NOFIXED_CONTROL and the input file uses VFC records but the output file does not, the fixed-length control field from the input record is not included as data in the output record. o If you specify /NOFIXED_CONTROL and the output file has VFC records but the input file does not, the control field attached to the output record is set to null.
Directs DIX to read records from an indexed file using a specified key of reference, such as the primary key, the first alternate key, or the second alternate key. Format /KEY=n
Specifies that records are to be inserted into their proper position in an existing indexed file. Format /MERGE /NOMERGE (Default) The /MERGE qualifier is useful when your input records are not sorted and you do not want them to be sorted as they are loaded into an output file. If you specify both /MERGE and /CREATE, /MERGE overrides the /CREATE qualifier.
Determines whether short records are to be padded. Format /PAD [=[%b]x] /NOPAD (Default) Specifies that the short records are to be padded with either ASCII characters (A through Z, a through z, or 0 through 9) or numeric values. To specify x as a numeric value, you must specify the numeric base using the percent symbol (%) followed by one of the following characters: D Indicates that x is a decimal number. O Indicates that x is a octal number. X Indicates that x is a hexadecimal number. B Indicates that x is a binary number.
Specifies the prolog version number of the output indexed file. Format /PROLOG=n Specifies the prolog number 1, 2, or 3.
Specifies whether each input record is to be read from the file a second time and compared to the record originally read.
Increases DIX's performance by reducing the number of required passes through the input data. This is accomplished by placing alternate key information into the CONVWORK file. Format /SECONDARY=n Qualifier Value n Specifies the number of alternate keys that will be loaded to the CONVWORK file with each pass through the input data. This qualifier is valid when you are fast-loading a file with more than one alternate key. This option allows CONVERT to use more disk space for its work file than would be used by default. The default number of alternate keys written to the CONVWORK file is 1.
Specifies whether the input file is to be opened for sharing with other processes during the conversion.
Specifies whether the input file is to be sorted before being loaded into an indexed file. The sort is done according to the primary key of the output file.
Determines whether statistics about the file conversion are to be displayed. Format /STATISTICS[=keyword] /NOSTATISTICS (Default) Keyword Meaning BRIEF Displays a summary of the file conversion at the completion of the operation. This is the default. FULL Displays summary information at the completion of each key load containing Sort and Load statistics for the key. A summary of the file conversion is also displayed at the completion of the operation.
Specifies whether records that exceed the maximum record length for variable-length records, or records that exceed the specified record length for fixed-length records, are to be truncated.
Specifies the number of temporary work files to be used during the sort process. Format /WORK_FILES=n Specifies the number of work files you want. You can specify 0 or any value from 1 through 10. The default is 2 work files.
Specifies whether all writes are to be checked by comparing the new disk records with the original records in memory.
Create something CREATE/FILE filename !create new file CREATE/DESCRIPTION new_description !create new description record CREATE/RECORD [tag] !create new record in a file In DIX mode the /RECORD is the default In DCL mode the /FILE is the default
CREATE/RECORD [TAG] Create a new record. The record will be filled with default data - binary null for non-text fields - Spaces for text fields and then allow you to modify this record, and eventually write it out via the Update command. This is the default in DIX mode
CREATE/FILE filename [/fdl=fdlname] [/log] Create a new file. Optionally specify an FDL filename Filename must be specified. If the FDL filename is specified, the file is created using the FDL, otherwise a variable length file is created. This is the default in DIX mode
CREATE/DESCRIPTION name [/qualifiers] Create a new description. This can be in the system_library (if you have write access), the user_library or in a file. Supported qualifiers /SYSTEM_LIBRARY The new description will be placed in the system_library /USER_LIBRARY The new description will be placed in the user_library If you specify nothing, the new description will be in a file in the current directory. /TPU Use the TPU editor for editing /EDT Use the EDT editor for editing If no editor is specified, use the internal editor
is an alias for CUT
CUT[/qualifiers] [TAG] COPY is an alias for the word Save current record values to save area (clipboard) or to a symbol. TAG is optional. If not specified, the current file is used, otherwise the file specified by 'TAG' is used. The PASTE command can be used to restore data from the save area. See the help about [DIX/HELP] interactive PASTE Qualifiers can be /SYMBOL=symbolname Save the data to a DIX symbol You can use the PASTE command to restore the record from this save-area or symbol. /DCL The symbol name is a DCL symbol. There are limitations on the length of DCL symbols, and if you exceed them, you will see an error /GLOBAL The DCL symbol is a global. If the file is a VFC file, and the /symbol is present, 2 symbols are created 1. symbolname : Containing the record data value 2. symbolname_VFC : Containing the VFC data
Skip the rest of the for, repeat, while, loop block and resume execution at the corresponding ENDxxx statement to start the next iteration. This command does not exit the current block (as the LEAVE command). Example: nrec = 0 REPEAT read !read next record if (fieldname=5) cycle !if a fieldname = 5, skip the rest fieldname = fieldname+1 !update the fieldname UPDATE !and write out to the file nrec = nrec + 1 !and count UNTIL nrec=10 !when 10 processed stop
DATE [/type=enum_type][/level=n][/global] name[dimensions][=value] DATE /INDEX=indextype name Declare an indexed symbol of type integer DATE name[=value] Declare a new symbol of type "DATE" and optionally give a value. The value must be of type "date" See the help about [DIX/INT] interact declaration for the enum_type See the help about [DIX/INT] interact symbols indexed_symbols for /INDEX Example: DATE start_date=f$date("1-JAN-2004") See the help about [DIX/HELP] interact declaration
Deassign logicalname[/qualifiers] Supported qualifiers are Qualifier for the table /cluster /system /group /job /process /table=tablename Qualifiers for the mode of the logical /kernel /executive /supervisor /user
syntax decent [/qualifiers] parameter Decent the DCL procedure or DIX procedure - Replace all verbs/qualifiers by the full text - Uppercase/Lowercase all verbs/quals.. - Create a nice indentation around if-then-else-endif - and lots more, see further help Parameter can be - A single command to be decented - sys$input, sys$command. Dix will ask for a lines to be decented until the user types a ^Z. The user may also change the settings with a command starting with a / f.e. /fix=all. /explain is also supported. Processing a file is supported via @filename See example below - dclfile, they may contain wildcards, all files matching will be processed See also /output and /log and /confirm Qualifiers are
$dix/command decent sys$input.!no fixes no cases no indent DCL-Line:sh ti $SHOW TIME .!all upper $/explain Settings after Change /FIX=NOALL /ALLOW=NOALL /FORMAT=NOALL /WARNING=NOALL /SPACES=NOALL /LOWER=NOALL /UPPER=NOALL /COMMENT=NOALL /INDENT=(Initial=1,Before=0,After=0,Labels=0,Continuation=0) /Twophases/Dcl/Lax_quotes DCL-Line:/lower=(all,nolabel)/upper=label/indent=initial=8/expl !change setting Settings after Change !and show /ALLOW=NOALL /FORMAT=NOALL /WARNING=NOALL /SPACES=NOALL /LOWER=(Verbs,Qualifiers,Lexicals,Keywords,Data,Strings,Filenames,Logicals,- Usernames,Input,Symbols) /UPPER=(Labels) /COMMENT=NOALL /INDENT=(Initial=8,Before=0,After=0,Labels=0,Continuation=0) /Twophases/Dcl/Lax_quotes DCL-Line:sh ti !try again, now lowercase and at pos 8 $ show time DCL-Line:label:sh ti !but labels uppercase $LABEL: show time DCL-LINE:@proc !will process proc.com in dclmode or proc.dix in dix mode ... ... !output from proc.* ... DCL-Line:/nodcl.!switch to dix mode DIX-Line:sh al SHOW ALL !DIX command (no $ in front) Line:^Z $
When you specify /auto, dix will read the first line of the file to see if there is a $ in front. If so, DIX assumes the input file is a DCL command procedure. If the $ is not found it must be a DIX script See also the /dcl and /dix qualifiers. There is no default filetype in this case. Also the /fix=missing_dollar is ignored.
/procedure /noprocedure the argument can be either the name of a DCL procedure or a one-line command. DIX will check p1 for characters / space or = If any of them is present, the default is /noprocedure so a one-line command If none is present the default is /procedure, so a procedure name The qualifier can be used to override this default behaviour if present The parameter will be used as the name of DCL procedure, default .COM if negated the parameter will be used as a one line DCL command.
/comment=(position=nn, at_end, compress) position Position in the line for the comments Comment lines without statements are printed as found Comment text after statements are by default printed directly after the command. If you specify /comment=pos=number, comments will be placed at column 'number' If you specify /comment=pos=-number, comments will be placed at -'number' after the command line If you specify /comment=pos=tab, DIX will insert spaces until a TAB position This can also be achieved via /spaces=comment=tab, but that will insert a TAB character, and overrule the comment=pos=tab. at_end Specifies that comments will only be placed on the last continuation line compress Remove leading spaces from comment keep If the comment is only the comment character ! DIX will remove the ! character also if you specify comment=keep the ! will be retained align_last If comment must be printed after the code line, DIX will normally print the comment at position 2 If you specify align_last, the comment is aligned with the previous comment
If you specify /confirm, DIX will ask you if you want to process the file. This may be useful if there is a wildcard in the inputfile
The input file is a dcl command procedure. You can either use /dcl or /dix (input file is dix procedure) If neither is specified (or /auto), DIX will look into the file and if the first character is a $, DIX will assume the file is a DCL procedure. If you specify /dcl the default input filetype is .com, If neither /dcl nor /dix is specified there is no default filetype
The input file is a dix command procedure. You can either use /dcl or /dix (input file is dix procedure) If neither is specified (or /auto), DIX will look into the file and if the first character is a $, DIX will assume the file is a DCL procedure. If you specify /dix the default input filetype is .dix If neither /dcl nor /dix is specified there is no default filetype
/explain or / /explain=all or // DIX will print out the various settings. If you specify /explain=all this will be done twice, once after the settings file is processed and once after the command line processed.
If you specify /image and the command is $ MCR IMAGE ..., DIX will look in the image (default filename SYS$SYSTEM:.EXE) for a valid DCL table. If it finds one, that table will be used to check (and expand) the command. This also works if you have a foreign command definition like $ UAF:=$AUTHORIZE or $ UAF:=MCR AUTHORIZE. It even understands extra text in the symbol like $ SYSMANIO:=$SYSMAN IO In the translated command the verb will remain the same. This qualifier is not default.
/indent=(token...) This sets the values for indentation Token can be initial=value Set the initial indentation, value can be tab or a number before_then=value Set the indentation of the if/then/else/endif command value is a number of TAB after_then=value Set the indentation of lines between then[,else] and endif value is a number of TAB label=n Set the indentation for labels, value may be negative or CODE to align with code or 0 for toplevel continuation=n Set the extra indent for continuation lines, this is added to the current indentation (value may be negative) datalines=n Set extra indent for datalines that contain commands in images. 0=same level as command, >0 deeper, <0 less deep If you do not specify indent=datalines[=value] no indentation is done. You can disable indentation for a specific image in the dix_decent.setup file comment Align comment lines without commands or labels to the code The default is init=8,before=1,after=1,labels=0,cont=4
/init=filename Used to define symbols from a command file. e.g. LOGIN.COM or SYS$SYLOGIN. Files may be nested.
Change the output format /format=(tag...) tag : keep_lex Do not break lines in the middle of a lexical function blank_before_label Insert a $! before a label remove_blank_comment Remove all $! lines qualifier_on_line Try to break on / (new qualifiers) dash_in_comment Add a - in the comment if the comment is continued on the next line. DCL ignores this, but it signals that the comment is on the next line semicolon Show a ; between comments on multiple lines in the original source quoted_on_line Do not break lines within a "" string header Insert header line(s) in file, see below add_defaults Show all default qualifiers/parameters too identifier=user If in an acl the uic is something like identifier=[tcpip$aux,tcpip$ftp] DIX will remove the group info, so the result will be identifier=tcpip$ftp identifier=keep Leave the original idname intact so if you specified id=[1,4] it will not be changed to id=system labels Add the name of the subroutine to all labels found in the subroutine, and also the references If header is set, the user can select the format of the header in the dix_decent.setup file via the header command. DIX will check if the filename occurs in the comment of first 10 lines. If the name is found, DIX assumes all is okay, and does not insert extra lines. If the filename is not found DIX will add one or more lines. See the documentation about the setup file for more info
/fix=(tag...) Fix a number of possible issues with the DCL code tag can be
Add the name of the subroutine in the comment after an EXIT or ENDSUBROUTINE statement.Also the first label of before a return will be inserted in the comment after the return. If the name to be inserted is already present, DIX will not insert it again. The exit of the main level can also be appended if /fix=add_name=all is used. The name added comes from the /name qualifier. See the help there
Replace the assign statement by the define statement. It also removes the optional : in the second argument of assign so assign a b: will be define b a If /QUEUE or /MERGE is present, the change will not be done If a ' is present, the change will not be done (maybe it contains /mer or /que) unless you specify /fix=assign=all
if you specify /fix=backslash DIX will remove the \ after the verb this is sometimes used to prevent symbol substitution as in $delete\ x.x;
DIX will remove unnecessary () in keywords and if statements keywords direct/sel=(size=(min=10)) will be directory/select=size=min=10 The brackets will not be removed if one of the values contains a ' since that expression may contain a , Like $privs="cmknrl,oper" $set proc/priv=('privs') If statements if (expre) then command to if expre then command The brackets will not be removed if expr contains ( or ) Assignments a=(a+b)
DIX will replace the = sign by a : in sort or search /key=(pos=nn,siz=nn) to pos:nn,siz:nn and in protection /prot=rw to /prot:rw
If datalines (in deck part) DIX will look in the image from the previous line to see if that image contains a CLD table. If so DIX will try to expand the datalines Example: $ mcr authorize SHO US * !will be replaced by show user * mod abx/priv=cmk !will be replaced by modify abc/privilege=cmkrnl $ copy sys$input tt: text line 1 !will not be replaced since copy has no CLD table text line 2 !(it is in DCL tables)
Automatically insert $DECK/$EOD around lines that do not start with a $
Some directory names are modified - If a filename contains an emtpty directory string , DIX will remove it so disk:[]file will become disk:file - <> are replaced by [] - 0,0 is replaced by 000000 - [000000.abc] will be replaced by [abc]
Replace operators with no trailing . so .eq will be .eq.
Replace EOJ by EXIT
replace multiple ! with only 1 so command !!!comment will be command !comment
Add $exit to procedure and not yet seen the $exit will not be added if the last statement is a return or a endsubroutine
replace f$fao("abc") by "abc" but not if there is a ! in the string that might be a directive
/fix=filenames /fix=filenames=default /fix=filenames=all DIX will append missing file type for according to the setting in the dix_decent.setup file. For example @filename : default type is .COM submit file : default type is .COM call file : default type is .COM submit xyz/log=file : default type is .LOG type file : Default type is .LIS print file : Default type is .LIS run file : default type is .EXE convert/fdl : default type is .FDL create/fdl : default type is .FDL set command : default type is .CLD If only the name of the file is present, DIX will not add the default file type, since the name could be a logical. If any other part of the filename is present DIX will add the default file type. If you want to add the file type also if the name is the only part of the filename, specify /fix=filename=all. Doing this may make the output file not correct. DIX will check if the name is a defined logical, if so, DIX will not fix the filename If you specify /fix=filenames=default, and the command is not one of the specified in the .setup file, and the cld entity contains a default name, DIX will use that name as default file type
DIX will make two lines of the THEN statement and ELSE statement This is the the only action taken if you specify /fix without keywords
Force all labels to be printed on a separate line
Remove all leading $! lines from the file
Replace show magtape by show device/full
See if a symbol assignment for a foreign command needs to be replaced by mcr so symb="$image .." replaced by symb="mcr image ..." fix=mcr=never !never replace the $ by mcr fix=mcr=allways !always replace the $ by mcr fix=mcr=system !only replace the $ by mcr if image is in sys$system For /fix=all, the default is fix=mcr=system
If you specify /fix=missing_dollars and the input file does not contain any command with a leading dollar DIX will insert a $ in front of all lines This is ignored unless the /dcl is also present.
multiple $! lines will be replaced by a single one
Replace filenames with [_]nla: and [_]nla0: and [_]nl0: to _nl: on places where the parameter is a filename in the CLD if /fix=nl=all is specified also the define/assign is checked
DIX will replace (some) obsolete commands by the newer commands lexical function f$logical by f$trnlnm commands SET ACL by SET SECURITY/ACL SET FILE/PROT by SET SECURITY/PROT SET FILE/ACL by SET SECURITY/ACL
/fix=output DIX will process the value of the /output qualifier always as type $outfile Some commands have the type defined as quoted_string (tcptrace f.e.). With this fix you override that type This will not work if the the /output has a userdefined type
Replace RUN SYS$SYSTEM:IMAGE by MCR IMAGE (only if nothing else on the line) and MCR SYS$SYSTEM:IMAGE by MCR IMAGE
Replace the symbol:="string" by symbol="string" So remove the superfluous :
Replace $a="abc" + - "xyz" with $a="abcxyz" but only if the length of the command will be not too long
symbols All symbol assignments local and global symbols=[no]local Only local symbol assignments symbols=[no]global Only global symbol assignments symbols=both both local and global assignments symbols=[no]all All symbol assignments even with long verbs/qualifiers if you specify /fix=symbols, DIX will try to expand the value in the string assigments so if you have sw:=set ter/wi=132, DIX will expand to sw:=set terminal/width=132 This only works if the asignment is a string assignment (:= or ="") and the string starts with a valid verb If you do not specify symbols=all the found verb must be shorter or equal than the actual verb, so if you have the assignment $dd="Openvms/Wri" If the symbols=all is specified (or /fix=all), this statement will be replaced by "openvms/write", since openvms is recognized as a valid verb (open) If the symbols=all is not specified, the statement is not replaced since Openvms is longer than the actual verb open If you had specified dd:="Openvms/dummy" the statement will never be replaced since this is not a valid statement If you had specified dd:="Ope/Wri" the statements will always be replaced with "open/write"
Do tab expansion in the comment part(replace them by spacs). The tab interval is set via the /tabinterval=nn (default 8)
If you specify /fix=trailing_semicolon (or /fix=all), DIX will remove trailing ; from filenames. This is not done for the delete and the directory command) and also not if a version is specified. so type a.a; will become type a.a
Replace the name UCX by TCPIP
Remove unprintables from source (all except TAB) /fix=unprintables=(tag,...) DIX will insert statements like ESC[0,8]=28 and replace the escape characters by ''esc' or 'esc' For the unprintable names see DIX> show character/unprintables Tag can be top : Insert the definitions only once at the beginning of the outputfile before : Add the definitions just before the command is printed. This may add the definition more than once. prefix=intro : By default only the unprintable name is used, but you may prefix the name by any string, possibly to prevent other definitions So /fix=unprin=prefix=DIX_ will add the DIX_ESC definition remove=(char...) : Remove some unprintables from the output file char is the name of the unprintable char. This name can be found in DIX> show character/unprintable. Only char codes 0..31 can be removed. Example /fix=unpr=remove=(nul,ff) will remove the Null and the Form Feed characters upper : Normally only characters 00..31 and 128..159 , 127 and 255 will be changed. If you specify /unprint=upper, also chars 160..254 will be changed. With top all definitions are declared only once (at the beginning of the outputfile). With before, each occurrence of an unprintable will result in a (new) definition. If you specify /fix=unprintables=top, /twophase is also set The default for /fix=unprintables is /fix=unprintables=(before,prefix="")
Allow case changing of unrecognized commands
Remove all trailing $! lines from the file
Replace the filename;0 by filename;
All of the above without the filenames.all and nl.all and assign.all
All means all fixes
/name /name=name If you specified /fix=add_name=all, DIX will append a name in the comment of the exit statements of the main level. If you do not specify /name, DIX will use #main If you specify /name without a value, DIX will insert the name of the procedure (not the type) If you specify /name=myname, DIX will use myname
/length=n output qualifiers and keywords with maximal n characters or many as is needed to be unique. THis can be used to keep the length to a reasonable value example $dix/comm dece def a b /tra=con Result : $ DEFINE A B/TRANSLATION_ATTRIBUTES=CONCEALED Normal complete expansion $dix/comm dece/leng=6 def a b /tra=con Result : $ DEFINE A B/TRANSL=CONCEALED expansion to maximal 6 letters $dix/comm dece/leng=1 def a b /tra=con Result : $ DEFINE A B/TR=CONCEALED In this case the minimum length to be unique is 2 since there is also a /table qualifier
If you specify /log DIX will print the name(s) of the file(s) processed.
Define the place where the output is printed if /output is not present, the output will be to SYS$OUTPUT If /output is present, it will be used the define the output filename the name is defaulted with the current input file The default value for /output=.com_dix So if the input parameter is *.com, DIX will create files with .com_dix
/tabinterval=nn default /tabinterval=8 Set the tabsetting for tab expansion
/width=nn Set the width of the output file. This also determines the place where DIX will wrap the command line. By default DIX will not wrap unless the output file is on a terminal. In that case the width of the terminal will be the width.
/lowercase=(token..) By default all items are unchanged, but you can select what you want to be in lowercase, see also /uppercase token can be [no]verbs Lowercase all verbs [no]qualifiers Lowercase all qualifiers [no]lexicals Lowercase all lexical functions [no]keywords Lowercase all keywords (.ne.,.. goto etc...) [no]labels Lowercase the labels [no]strings Lowercase all possible strings in lexical functions [no]filenames Lowercase filenames in f$search and f$parse [no]logicals Lowercase logical/tables names in f$trnlnm (if no CASE argument) [no]usernames Lowercase usernames in filenames node"user pwd"::... [no]input Lowercase datalines not recognized as commands for an image [no]symbols Lowercase symbolnames in "" strings like abc in "ab''abc'cd" All Lowercase all (except in quoted strings) If you specify /lowercase without any token, all items are lowercased (=all) If you specify a token in /loercase as well as in /uppercase, the text will be changed to lowercase (the uppercase is ignored)
/uppercase=(token..) By default all items are unchanged, but you can select what you want to be in uppercase, see also /lowercase token can be [no]verbs Uppercase all verbs [no]qualifiers Uppercase all qualifiers [no]lexicals Uppercase all lexical functions [no]keywords Uppercase all keywords (.ne.,.. goto etc...) [no]labels Uppercase the labels [no]strings Uppercase all possible strings in lexical functions [no]filenames Uppercase filenames in f$search and f$parse [no]logicals Uppercase logical/tables names in f$trnlnm (if no CASE argument) [no]usernames Uppercase usernames in filenames node"user pwd"::... [no]input Uppercase datalines not recognized as commands for an image [no]symbols Lowercase symbolnames in "" strings like abc in "ab''abc'cd" All Uppercase all (except in quoted strings) Other Uppercase all items not mentioned in /lowercase If you specify /uppercase without any token, all items are uppercased (=all)
/allow=(item,item...) Item can be
if you specify allow short, DIX will allow qualifiers that are longer then the define ones. For example In the help about show entry the qualifier /user_name is mentioned. In the CLD file this qualifier is /USER (so a bug in the docs) So $ DECENT/NOPROCEDURE show entry/user_name=system Will not be parsed, But $ DECE/NOPROCEDURE/ALLOW show entry/user_name=system Will translate to SHOW ENTRY/USER=SYSTEM
if DIX find a command with a qualifier in quotes it will not process the line, since this qualifier could initiate a syntax change and subsequent qualifiers/parameters could have a different meaning If you specify /allow=qqualifiers, DIX will continue parsing the command (and hopes the quoted qualifier does not change the sytax) f.e. $dir /'tag'/pa could mean directory/ftp/passive or directory/paged, the /ftp would change the syntax so that the /pa would become /passive and not /page
Will allow DIX to decent a statement if quotes are present Example: if in a file the following statement is found set acl/object=devi/acl'p4' 'p5' 'p6' if /allow=quotes is not present you get Quote found in ACL'P4' and not allowed via /allow=quotes in: set acl/object=devi/acl'p4' 'p5' 'p6' And the line will not be changed If /allow=quotes is present you will get SET ACL/OBJECT_TYPE=DEVICE/acl'p4' 'p5' 'p6' DIX has translated/expanded as much as possible There is a danger that DIX will expand the wrong text, so this is not the default, see the example below $tag = "term" $show 'tag' /p !will expand to show 'tag'/permanent !terminal $tag = "dev" $show 'tag'/p !will expand to show 'tag'/page !device
If you have an image that does the DCL parsing and that has only one verb like in define verb getuai parameter p1 qualifier account qualifier privs and in the image you do the DCL parse like call lib$dcl_parse('getuai '//commandline,..) you may use this in a foreign command like $ getuai system/account But in the DCL command is no verb and DIX will complain about that and cannot parse the line If you specify/allow=single_verb, and the image has only one verb (getuai in this case), DIX will parse the line according to the getuai verb, and does not signal an error. You can also specify a line in the dix_decent.setup with image getuai/verb=getuai
In some procedures the symbol assignments for new verbs will be done in a line number after the usage of the changed verb. Example: $ gosub init $ dd /full !usage of dd $exit $init: $ dd:= dire/vers=1 !definition of dd $ return By default, DIX will process the lines in order, and will find the usage (in line 2) before the definition (line 5), and not understand the verb dd. If you specify /TWOPHASES, DIX will read the procedure two times - The first time to remember the redefined verbs - The second time to do the real reformatting. and will process the verb dd (as dire/version=1) correctly.
/setup=file /setup=dix_decent A file containing information about how to process datalines in images and how to append filetypes to filenames. The defaultfilename is dix_decent, and the default filetype is .setup DIX will search for this file in the directory where the DIX executable is. comment is ignored (all things after a !) and blank lines are ignored The following lines can occur in the file
Syntax : header "line1","line2"... DIX can insert headerlines in the files if /format=header is specified In the lines can be control codes supported codes are !AS Insert the filename in uppercase !as Insert the filename in lowercase !UAS Insert the filename in uppercase !LAS Insert the filename in lowercase !XAS Insert the filename as is !%D !n%D !nn%D insert the creation date of the file !%I !n%I !nn%I Insert the onwer name There must be at least a filename control code present If the line does not start with a $!, DIX will insert it If no header statement is found it defaults to header="!AS" that will generate a single line $!name.type Example header "File : !AS","Author: !%I","Date : !20%D","" Will generate a header in the file containing $!File : X.COM $!Author: [STUBBF] $!Date : 12-JAN-2020:12:13:14 $! There must be at least one !AS in the header to prevent DIX from adding a new header if the file is processed twice
syntax : Image imagename [newimagename] [/qualifiers] Imagename is the name of the image newimagename is the replacement f.e. latcp does not have the cld definitions, but sys$share:lat$shr does so you can use : image latcp sys$share:lat$shr And DIX can find the cld tables there Qualifiers can be /noinput Image does not expect input so datalines after it must be comment /ignore Ignore all cld tables that may have been found in the image /lower Convert all datalines to lowercase /upper Convert all datalines to uppercase /case COnvert all datalines to the setting of /upper=data or /lower=data /[no]indent Indent datalines. The /indent=data=nn decides how the indentation is done. /[no]decent replace tabs by space and remove all multiple spaces /[no]dcl Support dcl like input /dcl and /indent are default if the image contains cld tables, but you may override with /no... /decent is default if /dcl is present, but may be overruled with /nodecent If the image is DCL , imagename is the name of a special dcltable file If no DCL definition is found, the DCLtables in P1 space are used /verb=verb Some images take the command line and prefix it with its own verb f.e. if you specify "dix/command decent f.com", DIX takes the command line "/command decent f.com", prefixes it with DIX and then parse it. If you specify image dix/verb=dix, DIX can parse these commands, but if you do not, you will get a warning "verb is ambiguous" See also the /allow=single_verb, but that only works if there is only one verb
Replace the found verb with a new one. FOr example: the RMU verb is acually RMUx (in my system RMUJ). If you try to decent the RMU commmand, this will come out as RMUJ command. If you do not wnt that, you can replace the found verb (RMUJ) by RMU. Syntax verb foundverb newverb FOund verb may contain wildcards. So in order to solve the above problem add a VERB RMU* RMU to the setup file.
A way to specify which filetype may be added for images in this specific verb syntax : file verb/parameter=n type [/qualifiers] Set type for parameters file verb/qualifier=qual type [/quaifiers] Set type for qualifiers Type may be specified with and without the ., so lis and .lis are the same Qualifiers can be /next_qualifier=qual For parametes folowed by a qualifier like link link a, b/opt, c/lib See example below /p1=parameter p1 must be parameter Examples file link /parameter=1 obj Parameter p1 is a .obj file file link /parameter=1/next=option .opt if next_qual=/option it is .opt file link /parameter=1/next=library .olb file @/parameter=1 com Parameter p1 is a .com file @/qualifier=output lis /output is a .lis file set /parameter=2 /p1=command msg set command , p2 is a .msg file set /parameter=2 /p1=message exe set message , p2 is a .exe file fms /parameter=1 flb fms, p1 is a .flb file fms /parameter=2 frm and p2 is a .frm For more examples see the dix_decent.setup delivered in the kit
Syntax decent /qualifier.... You can specify a number of command line qualifier settings. These setttings set a default, but can be overruled via the command line. You can have multiple decent verbs in the file The supported qualifiers are /FIX=, /FORMAT=, /WARNING=, /INDENT=, /SPACES=, /UPPERCASE=, /LOWERCASE=, /COMMENT=. f.e. Suppose you have the decent/fix=all in the dix_decent.setup file If you do not specify any /fix on the command line, DIX will apply all fixes, but you can also specify /fix=noucx to prevent the ucx fix. You can even specify /fix=(noall,ucx) the and ucx fix will be the only one If you specify /explain=all, you can see what settings are set after the .setup file and what after the commandline is processed.
/signal[=token] By default DIX will not complain about commands that it cannot parse. It will just send the original text to the output file If you specify /signal, DIX will print messages to sys$command about the commands that cannot be parsed If you specify /signal=inline, DIX will print the messages in the output file at the point they occur. If you specify /signal=begin, DIX will print the messages before the normal output in the output file If you specify /signal=end, DIX will print the messages after the normal output in the output file. If you specify /signal=file=outfile, DIX will prin t the messages in file "outfile"
/spaces=(tag,tag..) determines where DIX will insert spaces [no]assign DIX will surround the [:]=[=] operator with spaces [no]comment=end DIX will insert a space after the comment character ! [no]comment=begin DIX will insert a space after a ! on a line with no label/command [no]operators DIX will surround the .eq. etc. + / - operators with spaces [no]arguments DIX will add a space after a list of values so write out a,b,c will be write out a, b, c All All of the above /spaces without any tag is /spaces=all And two more comment=tab DIX will insert a tab before the ! on statement lines /comment=pos=tab will insert spaces until the next tab position. This will be overruled by /spaces=comment=tab comment=one DIX will insert a space before the ! on comment only lines comment
/table=(tablespec,tablespec...) !a list of spefications or /table=@filename !a file containing the specifictions !each line has one specification !default filename is .lst You can specify a different CLD table for specific images. Tablespec has the following syntax imagename#[cldimagename][#option[#option....]] if imagename is DCL or not present (and also no #) the cldimagename is used as an alternate DCL tables for all commands if imagename is present, the cldimagename is used for commands in the imagename Example: /table=([DCL#]mydcltable,sysgen#sysgentable) will use the mydcltables for the normal commands and sysgentable for commands in the image sysgen You can create a sysgentable via $ edit sysgentable.cld !and add the verbs/param/quals $ set command/obj sysgentable.cld $ link sysgentable The linker will warn you that no transfer address is specified, but you can ignore that warning The default file specification is SYS$SYSTEM:.EXE Options are #ignore : Do not look for cld tables in this image #noinput : This image does not expect input #decent : convert data lines to lowercase (if /lower=data) and do spacing #lower : just convert to lower case #indent : indent datalines to current indentation
/warning=(tag[,tag...]) tag can be duplicates : DIX will warn you about then same qualifier being specified more than once. obsolete : DIX will warn you about specific obsolete commands. global : DIX will warn you about global assignments quotes : DIX will warn you about missing ' and " unprint : DIX will warn you if there are unprintable characters in the file blank : DIX will warn you about empty lines dots : DIX will warn you about missing .'s after operators e.g. .EQ single_quotes : DIX will warn about 'a' in a "" string double_symbols : DIX will warn you if symbols are defined more than once unbalenced : DIX will warn you about a () inbalence long_command : DIX will warn you if the fist 4 character of a verb, but there are more unmatched characters dash : DIX will warn you about questionable - useage like .and. -k data_command: DIX will warn you for datalines that might be dcl-commands empty_data : DIX will warn you for completely empty data lines lexicals_in_comment : Warn about lex funtions in comment (except f$verify) dubious_assign : Warn for possible wrong assignment changes labels : warn for duplicate label names and for unused and wrongly used labels (f.e. gosub to SUBROUTINE) devices : Warn for physical devicenames (disk and tape) short_file : Warn for filenames with only one character in the name build_in : warn about $status .eq. instead of .eqs. These symbols are strings all : All of the above In order to see the warnings you must specify /signal[=inline] also. You can also disable a specific flag via f.e. /warning=(all,nolabels)
DECIMAL[/level=n][/global] name[=value] DECIMAL/INDEX=indextype name Declare an indexed symbol of type date Declare a new symbol of type "DECIMAL" and optionally give a value. The value must be of type "decimal" See the help about [DIX/INT] interact symbols indexed_symbols for /INDEX Example: DECIMAL counter=f$decimal("12345e12") See the help about [DIX/HELP] interactive declaration
Syntax, there are 2 formats format 1 for a limited number of data types 'type'[/type=enum_type] [/level=n][/global][/overwrite] - name[['type']*size][dimensions][=value] [,name[dimensions][=value]...] where type : REAL[*n], CHARACTER, LOGICAL, INTEGER[*n.m] or DATE, DECIMAL Format 2, more general DECLARE[/'what'] [/type=enum_type] [/level=n][/global][/overwrite] - name[*size][dimensions][=value][,name[dimensions][=value]...] In this case all 'what' can be any datatype. If you do not specify 'what', the value has an undefined type name : The name of the local symbol size : For integer and reals and dates. Set the size to be fixed. For integer size is nbyte[.nbits] (0.1 .. 8.0) For reals size is nbyte (4,8,16) For dates size is nbyte (4,8) value : An expression that returns a value of the correct type dimensions: Up to 3 dimensions (d1[,d2[,d3]]) Each dimension has the format [low:]high[:increment] low : Upper boundary (default 1) high : High boundary (must be present) increment : Increment. If present, low must be present too example (5:10:2) This results in 5,7,9 Symbols declared in this way cannot be declared again (unless with the /overwrite qualifier), and cannot be assigned another value than the declared type. See also the help about [DIX interactive] SET STRICT You may declare a symbol at a lower level. If you do not specify /level the symbol will be declared at the current procedure level. The value of level can be positive (the absolute level value) or negative (n levels higher). See the examples /global is the same as /level=0 For integer data you can set the enumeration_type. This is equal to the functionality of the "fieldnames" of fields. The 'enum_type' may be defined before with the ADD TYPE statement, or can be specified within quotes. If you want the use a previously defined type (add type) you must prefix the name with a # sign. See below Example: INTEGER a=10 Declare an integer a with value 10 INTEGER a=20 Will result in an error "symbol A is already defined." a=20 Is allowed, change the value to 20 (value must be integer) a="XYZ" Will result in an error "Symbol A has other type than expression" DECLARE A/INT=10 Is the same as INTEGER A=10 DECLARE X The value X does not have a fixed type X=10 Value of x is now 10 (integer) X="String" Value of X is now "String" (character) Example with defined types: DIX> ADD TYPE DAYS="0=sun,1=mon,2=tue,3=wed,4=thu,5=fri,6=sat" DIX> integer/type=#days weekday DIX> weekday=wed DIX> Show symbol weekday WEEKDAY=wed DIX> evaluate weekday !the eval will always return the binary 3 Example with direct type: DIX> integer/type="0=sun,1=mon,2=tue,3=wed,4=thu,5=fri,6=sat" weekday DIX> weekday=wed DIX> Show symbol weekday WEEKDAY=wed DIX> evaluate weekday !the eval will always return the binary 3 Examples for level/global: suppose we are at procedure level 3. Declare /level=1 symbol Will declare a symbol at level 1 declare /level=-2 symbol Will declare a symbol at level 1 Declare /global symbol Will declare a symbol at level 0 Declare new Will declare at level 3 Declare/level=-1 new Will declare at level 2
DECLARE[/WHATTYPE][/type=enum_type][/OVERWRITE] - [/level=n][/global] NAME[*size][DIMENSIONS]=VALUE DECLARE/INDEX=indextype/whattype value Declare a 'whattype' symbol with an index of type 'indextype' This is the more generic form for INTEGER/REAL/DATE.. declarations. If you specify WHATTYPE, DIX will define a symbol of the specified type. You cannot change the 'type' of the symbol later. If you do not specify the "whattype", DIX will define an "unspecified" symbol that can change types. Size can be specified like nbyte.nbit for integers and nbyte for reals DECLARE /int a*0.4 !declare a 4 bit integer See the help about [DIX/INT] interact declaration for indextype Example: DECLARE/LOG Q=false,A/INTEGER=10,B(10,10)/char="test",K This will declare 1. A Logical value Q with value false 2. An integer symbol A with value 10 3. A character table (10,10) with all elements initialized to "test" 4. A logical value K (undefined) Also See the help about declarations for more information
define logicals define keys define screenkeys
Define name logical name equivalence_name[,...] The same as the DCL define Supported qualifiers
The following qualifiers determine the table /CLUSTER /SYSTEM /GROUP /JOB /PROCESS /TABLE=nnn The following qualifiers determine the mode /EXECUTIVE /SUPERVISOR /USER /KERNEL The logical name can have the following attributes /NAME=CONFINE /NAME=NO_ALIAS Each equivalence string can have a the following attributes /CONCEALED /TERMINAL
DEFINE/KEY keyname string[/qualifiers] Define keys for the INTERACTIVE mode of DIX. See also the RTL Screen Management (SMG) manual about the possible keys. Also note that the f6..f14 keys are normally reserved for command line editing. You may use those keys when you set the terminal to /noline_edit, or if you prefix the key by a ^V. Also see the OpenVMS help about define/key.
/SET_STATE=name DEFINE/KEY keyname string /SET_STATE=NAME. Sets the key driver to state NAME.
/IF_STATE=name DEFINE/KEY keyname string /IF_STATE=NAME If the user enters "keyname", the string "string" will only be returned if a previous key has put the key driver in the "NAME" state. Name is NOT case sensitive.
After the /TERMINATE, the result will be given to DIX.
Echo the translated strings
DEFINE/KEY keyname string/SET_STATE=NAME/LOCK Normally the state is removed after the typing of the next key. If you define the key (and the SET_STATE) with the /LOCK, the state will remain "NAME" until another state is entered.
DEFINE/KEY skey function [/qualifiers] Define a key combination for the screen mode of DIX. skey : The keyboard key : Almost all keys can be used for keydefinitions. function : The DIX function See the help about [DIX/HELP] key_mapping DIX_functions for allowed functions
/SET_STATE=name The parameter "" must be present but the contents are not used. SMGKEY will set a new state (GOLD and BLUE are used by default, but you may redefine the states if you redefine all keys) State names may not contain a - (hyphen) Example: DEFINE/SKEY PF1/SET=GOLD "" DEFINE/SKEY UPPERCASE_A/IF_STATE=GOLD key_print If the user enters PF1-A, the function key_print is executed. For a list of allowed functions, see the help about [DIX/HELP] KEY_MAPPING
/IF_STATE=NAME Specifies a state that must be in effect for the key definition to work. The state name is an alphanumeric string. States are established with the /SET_STATE qualifier State names may not contain a - (hyphen) DEFINE/SKEY PF1/SET=GOLD "" DEFINE/SKEY F20/IF_STATE=GOLD key_print DEFINE/SKEY F20 key_swap_dis If the user enters PF1-F20, the function key_print is executed. It the user enters F20, the function key_swap_dis is executed. For a list of allowed functions, see the help about [DIX/HELP] KEY_MAPPING
/CONTEXT_SCREEN=Screen_context Define this key only for a specific screen. The default is that the key is valid in all screens Valid screens are DISPLAY_ALL Display data in all formats SELKEY Select data for a key value EDIT Edit description SELFILES Select one file when multiple files match EDITFILES Select a file (or add one) SELDESCRIPTIONS Select a description (or add one) YESNO Yes/No screen VIEW View all kinds of data HELP Help screen(s) EDITMULTIPLE Edit multiple lines (in show description) EDITLINE Edit a single line SELFIELD Select a field SHOWRAW Show data in raw format SHOWDES Show data in description format SELDEMO The select demo screen DISPLAY_SUBF Display all subfields display
DELETE/KEY name[/state=name] Delete SMG key definitions for interactive mode DELETE/SKEY/ALL Delete all (Default) keydefinitions for screen mode DELETE/SKEY skey [/STATE=NAME] Delete the key definition for skey (possibly with state NAME) DELETE/SYMBOL See deeper help DELETE/SYMBOL/LOG[/all] Mask Delete symbol DELETE/SYMBOL/LOCAL[/all] Mask Only delete local symbol DELETE/RECORD[/fast][/log] Delete the current record (if the file is indexed or relative and you have opened it with /MODIFY) This will set the record context to the next record If you specify /fast, a fast delete is done DELETE/FUNCTION[/log] mask : Delete functions DELETE/SEARCH [pattern]/LOG/CONFIRM Delete search patterns DELETE/VALUE pattern[/log]/global/level=n Delete values DELETE/TYPE pattern[/log]/global/level=n Delete types DELETE/PARAMETER pattern[/log]/global/level=n Delete parameters DELETE/SELECT_file pattern [/log/global/level=n] Delete select_file patterns If none of the above qualifiers is present, DIX will assume you want to delete files DIX> Delete filemask [/confirm][/log][/reverse] filemask A mask of files to be deleted /confirm Ask before deleting a file /log Show the file deleted /reverse DIX will first make a list of files matching the filemask and then start deleting these files in reverse order. This should make a difference on large directories. A small example on a directory with 1000 files and a size of 115 blocks DIX> time delete [.abc]*.*.* ELAPSED: 0 00:00:13.97 CPU: 0:00:03.67 BUFIO: 2002 DIRIO: 4898 FAULTS: 8 DIX> time delete [.abc]*.*.*/reverse ELAPSED: 0 00:00:11.25 CPU: 0:00:03.82 BUFIO: 2002 DIRIO: 3892 FAULTS:30
DELETE/SYMBOL MASK Delete the symbols matching MASK If the symbol is an indexed-symbol you can delete elements of the symbol delete/symbol indsym("A*") Delete all values of indexed symbol indsym matching A*. If you specify ("*") all values will be deleted, but the indexed symbol will not be deleted (it will have 0 values) See also the /EXACT qualifier below delete/symbol indsym Delete the whole symbol Supported qualifiers /EXACT : If the symbol is an indexed symbol, and you specify the /exact qualifier, the contents will be used exact, so the * and % character in the element selection will not be treated as a wildcard character, so the above example will delete indsym("A*") /LOG : Display the symbols deleted /LEVEL=n : Delete symbols from level n (0=global,1..depth=absolute level -1..-depth) is relative level /GLOBAL : Delete global symbols, is the same as /level=0 /LOCAL : Delete local symbols, is the same as /LEVEL=DEPTH /ALL : Delete all symbols, is the same as MASK= *
This command is only allowed in a command procedure. The DIX debugger will be started. You can also use the command "on control_c debug" If you then type a ^c during execution of a command procedure, the debugger will be started. You can use the command "on error/warning debug" If a command returns an error/warning, the debugger will be started You can also start a command procedure with /debug Example: Suppose the script file (examp.dix) contains on control_c debug k=1 10:k=k+1 goto 10 got_l1:say "Seen ^C" goto 10 DIX> @examp ^C %DIX-I-DEBUG, Entering debug mode 6:goto 10 !DIX tells you the current statement DixDbg> eval k !see how we got 172469 DixDbg> go !keep going ^c %DIX-I-DEBUG, Entering debug mode 6:goto 10 !Again this is where we are DixDbg> eval k !ask for k again 613507 DixDbg> quit !skip the test, back to interactive mode DIX> @examp/debug !start in debug mode DixDbg>
DEPOSIT fieldnamemask=value. DEPOSIT offset=value DEPOSIT /symbol symbolname=value Modify a field (or symbol if /symbol specified) to the given value. for the DEPOSIT/SYMBOL see the deeper help in the /SYMBOL DEPOSIT fieldname = value DEPOSIT/RAW offset[.bit_offset] = value DEPOSIT/VFC Deposit data in VFC buffer or record The entered data is first 'unsymbolized' (see substitution) and then translated according to the field definition, and deposited in the data-record. You can modify more than one field in one statement, but all the used fields must have the same type. If you modify more than one field, the /CONFIRM may be useful. DEPOSIT will save the contents of the record before the modification You can undo the changes for this DEPOSIT with the UNDO/LAST You may also go back to the original record with the UNDO The value specified is converted to the binary equivalent. This will do what you expect, but there are some extensions See the CONVERSION subtopic. You may also assign values to fieldnames via the assign (val=expr) command The differences are deposit allows wildcarding of the name (a text match is done) the text after the = is interpreted as text, and will be converted according the fieldname type. assign Does not allow wildcarding of the name, but it does support wildcarding in the lowest dimension The piece after the = is evaluated as an expression, and must deliver a result of the same (or compatible) type as the field Examples: DEPOSIT /word 10=5 !modify the word (16 bits) at offset 10 to 5. DEPOSIT *COUNTER*=0 !Modify all fields matching *COUNTER* to 0 ! you may undo this with UNDO/LAST DEPOSIT *PRIME*{*DAY*}=false !modify all subfields matching *DAY* of !all fields matching *PRIME* to false DEPOSIT UAF$Q_LASTLOGIN=1-JAN-2012:12:12 !set the lastlogin field (type date) to the date !DIX will convert the string to a date format
Interpret the data in binary this is a shorthand for /radix=2
/BITS=number_of_bits For raw mode you can set any bitsize of 1 up to 64.
Modify data in bytes. Valid only in /RAW mode.
DIX will ask you if the modification should be done. This may be useful if you specify a wildcard in the fieldname. If conform is set. DIX will ask before every modification MODIFY field to value [y]/q/a/q : You may answer Y : Modify this one and keep asking for the next N : Do not modify this one and keep asking for the next Q : Do not modify this one and stop processing A : Modify this one and stop asking (as if confirm was off)
Interpret the data in radix 10. This is only possible for [u]integer fields this is equal to /radix=10
/FORMAT=option Normally all "character"-like fields will not contain unprintable data. These field types are CHARACTER,xSTRING. If the data does contain unprintables (hex 0:1f,7f,80:9f or ff) the /FORMAT qualifier determines how this data should be displayed. The default is the current format setting (set/show format) Option can be DOT :All unprintables are replaced by a ".". This encoding is not reversible, after an unprintable value is replaced by a ".", DIX cannot know what the unprintable value was. This may be a problem in the screen mode. HEX :All unprintable data is displayed as %Xdd, a hexadecimal display. A % in the data will be displayed as %%. This display is reversible, so DIX can reconstruct the original unprintable value. If you are in this mode, on input a % must be entered as %% PASSALL:DIX will not change the unprintable data. The data is displayed as it is. This mode will not work in screen mode, and maybe poorly when the output device is a terminal. DUMP :Unprintable bytes are represented by a 2 or 3 letter mnemonic like <DEL> or <CR>. A < in the text will be displayed as <<. This display is reversible, so DIX can reconstruct the original unprintable value. If you are in this mode, on input a < must be entered as <<
Modify data in longwords. This is the default in /RAW mode. Valid only in /RAW mode.
/RECOVER (Default) /NORECOVER If you specify /recover, DIX allows you to roll back the changes made in this deposit by using UNDO/LAST If you specify /NORECOVER, DIX will not save the previous context, this may be useful in a script, when you are sure you will never UNDO the change.
Integers are converted as unsigned.
Modify data in words (16 bit values). Valid only in /RAW mode.
Modify data in quadwords. Valid only in /RAW mode.
Interpret the value in hexadecimal. This is a shorthand for /radix=16
Interpret the value in octal. This is a shorthand for /radix=8
/RADIX=nn Interpret the data in a given radix. nn must be between 2 and 36 For /radix=16,8,2 are shorthand defined as /HEX,/OCTAL and /BINARY A radix which is not a power of 2 (so not 2,4,8,16,32) can only be used on [u]integer fields For radix 36 the characters 0..9 and A..Z will be used (so Z=35)
Display data in raw (non description) mode. In this mode the qualifiers /WORD, /BYTE, /LONG, /HEX are significant. The default is the /LONG. Offset can be specified as byte_offset[.bit_offset]
Deposit/symbol[/raw] symbol=value Allows you to use the deposit for a symbol. Most of the qualifiers defined for the deposit command work here too, except /offset, /confirm, /recover, /VFC If the /raw is not specified, the value will be converted to binary using the datatype of the symbol If the /raw is specified, the value will evaluated as an expression and the result will be stored in the symbol regardless of type. All bits of the symbol will be overwritten unless the source size is explicitly specified via /byte,/word,/long,/quad of /bits See the following example Somewhere in a file we see the binary value of a date i.e. in the dump file at location %hex 80 is the dump date So: $ DUMP/BLOCK=COUNT=1 SYS$SYSTEM:SYSDUMP.DMP Virtual block number 1 (00000001), 512 (0200) bytes ..... FFFFFEFC 00000000 FFFFFEFD BF6FC000 .@o?............ 000070 00A9B3FE D141FF1D 00B257CF 0D0A8DF4 t...OW2.....A3). 000080 !Offset 80 ..... DIX> date ddate !make a date type symbol ddate DIX> deposit/symbol/raw ddate=%x00B257CF0D0A8DF4 !fill the value DIX> say ddate !and show it 13-DEC-2017 19:14:24.31
Normally the value will be converted to binary, but for some field-types more options are available. See below (R)BITS fields DEPOSIT field=name1,name2,name3 Set bits name1,name2,name3 DEPOSIT field=+name4 Leave the original value, and add name4 DEPOSIT field=-name1 Leave the original value, and clear name1 INTEGER*n with n=1,2 Only normal integer conversion is tried INTEGER*4,*8 First try integer conversion. Then try %Xnnnn, the %Onnnn, %Bnnnn, %Dnnnn conversions (hex,octal,binary,decimal) Then try 'dddd'X, 'dddd'O, 'dddd'B 'ddddd'D conversions (hex,octal,binary,decimal) Try to convert as date*4,*8 Try to convert as IDENTIFIER Try to convert as UIC Try to convert as 'xxxx ASCII On VAX INTEGER*8 is only partial supported and is expressed as INT*4.INT*4 VFC The format is "DD text" The DD are 2 hexadecimal chars. Not all combinations are valid. The text field is ignored. Only 0..7F : 0.127 linefeeds 80..9F : C0 control codes 00..1f E0..EF : VFU codes 00..0F See the OpenVMS manuals about VFC formats.
DEMO [whichdemo [startscreen]] DEMO/FILE=demofile DEMO/LIST Show the possible demos Jump to demo mode. The parameters are whichdemo : The name of the DEMO, as found in DEMO/LIST (or show demo) startscreen : The start screen in the demo, default is MAIN Supported qualifiers are
/SCREENNAME (Default) /NOSCREENNAME Show the name of the screen at the top of the display If you specify /noheader, the screenname will not be visible.
/HEADER (Default) /NOHEADER Display a header line, containing the demo name, and the screen name.
All key input will be uppercased.
DIRECTORY filemask [/qualifiers] [,filemask...] [filemask] This looks like the normal OpenVMS directory, except that DIX will only display the highest version, unless you type ;* Filemask is a normal OpenVMS file specification with wildcards (like directory) or a library specification: modulemask@librarymask or librarymask(modulemask) There are 2 special librarynames DIX_SYS : The system-wide library DIX_DES.TLB DIX_USR : The user library DIX_USER.TLB Directory can also do a fast search (using /fast). In this case DIX will try to open the DEVICE:[000000]INDEXF.SYS (like DFU). You must have read access to this file. If you specify /fast or use a library specification, and you do not specify a /[NO]SORT command, DIX will automatically add a sort over the whole dev/dir/filename/type/ver[/module] All type file files/methods can be mixed. DIRECTORY support up to 8 parameters, each as a list. DIX will allow you to place a wildcard in the device part. If you do that DIX will do a scan of all disk (devices of class DC$_DISK) that are mounted and not members of a shadowed disk (so the DSAdd is searched but not the members of that shadow set). Then a match will be done with the fulldevnam, and if that fails the volume label. DIX can also show the current open memfiles DIX> DIR MEM:mask The following qualifiers are supported
DIX> DIRECTORY *.CLD ! Display all CLD files Directory: USER50:[STUBBF.PROGRAMS.DIX.SOURCE] DIX_CLD.CLD;332 Total of 1 file DIX> DIRECTORY SYS$LIBRARY:*V*.olb,starlet(*ACC*) Directory: SYS$COMMON:[SYSLIB] RDBVMSLIB72.OLB;2 Library: STARLET.MLB;1 $ACCDEF $ACCESSDEF $CHECK_ACCESS $CHECK_ACCESSDEF $CHECK_ACCESS_G $CHECK_ACCESS_S $ICC_ACCEPT $ICC_ACCEPTDEF $ICC_ACCEPT_G $ICC_ACCEPT_S $MTACCESS $MTACCESSDEF $MTACCESS_G $MTACCESS_S $SNDACC $SNDACCDEF $SNDACC_G $SNDACC_S Total of 18 modules VAXCCURSE.OLB;1 VAXCRTL.OLB;2 VAXCRTLD.OLB;2 VAXCRTLDX.OLB;2 VAXCRTLT.OLB;2 VAXCRTLTX.OLB;2 VAXCRTLX.OLB;2 VMS$VOLATILE_PRIVATE_INTERFACES.OLB;2 Total of 18 modules, 9 files DIX> dir sys$sysdevice:*imagelib*.OLB/fast Directory: SYS$SYSDEVICE:[VMS$COMMON.SYSLIB] CXML$IMAGELIB_GS.OLB;1 CXML$IMAGELIB_TS.OLB;1 IMAGELIB.OLB;1 Total of 3 files DIX> dir *@dix_sys !display all modules in the DIX_DES.TLB Directory: FEKKO$DKA300:[STUBBF.PROGRAMS.DIX] Library: DIX_DES.TLB;148 $AREA $BUCKET $DEFAULT $KEY $LINE $PROLOGUE *DAF*.DAT .AUDIT$JOURNAL .BCK|.SAV .CRF_CROSS .CRF_FILE_NAMES .CRF_MOD_NAMES .DIR ACCOUNTNG ACMSDDF ACMSUDF ACU_PORTS ACU_USERS BSO_APPLICATIE BSO_VERSIE DEMO#CREATE_DES DEMO#DIX_GENERAL DEMO#GENERAL_DES DEMO#GENERAL_RAW DEMO#MODIFY DEMO#SEARCH DOCDB FILECAB INDEXF KEYS-*.IND KEYS-*.VAL LMF$LURT MNU_USERS MONITOR NET$PROXY NETPROXY NETWORK PARTITION PENDING PROFILE QUOTA.SYS RESERVATIONS RIGHTSLIST SWITCHFILE SYSUAF TCPIP$HOST USERTYPE_MYTYPE VIEW#.CRF_CROSS VIEW#.DIR VMS$PASSWORD_HISTORY VMS$SYSTEM_IMAGES.IDX VMSMAIL_PROFILE Total of 52 modules DIX> DIR dsa*:[dir]file.type !Search all DSA devices for file [dir]file.type If some disks have a volume label USERnn, DIX> DIR USER*:[dir]file.type !Search all devices with !volume label USER* for file [dir]file.type
If you specify a /before or /since, the date will be checked against the backup date
/before=date Display only files younger than 'date' See the info about /create /expired /modified and /backup date can be a normal OpenVMS-date (including today, yesterday, tomorrow) or one of the keywords created/expired/modified/backup
/BY_OWNER=owner Select only files with this owner
/COLUMNS=n Normally DIX uses the width of the filename to determine the number of columns. If you specify /columns=n, DIX will use this value
/highlight=(colourspec,colourspec..) You can use colours to highlight certain filetypes colourspec is filetype#colourname[#modifier[#modifier...]] or filetype:colourname[:modifier[:modifier...]] the colours WHITE,RED,GREEN,YELLOW,BLUE,MAGENTA,CYAN,BLACK are supported modifiers are BOLD, REVERSE, UNDERLINE and BLINKING Only one colour can be specified, but multiple modifiers are allowed The first colourname can also be a modifier so exe:underline is valid You can specify upto 16 filetypes If you specify /highlight without a value the default is /highlight=(dir:yellow,exe:red,com:magenta)
If you specify a /before or /since, the date will be checked against the creation date
/DATE=(keyword[,keyword...]) Display the date(s) of the file Keywords are CREATED Creation date MODIFIED Modification date EXPIRED Expiration date BACKUP Backup date ALL All dates
/EXCLUDE=(filespec[,...]) Excludes the specified files. You can use wildcards in the directory, name and type. The device part is ignored.
If you specify a /before or /since, the date will be checked against the expiration date
/extent /extent=full Display info about the number of header/extents of the file in the format "headers\extents" to differentiate with the size "eof/alloc" if /extent is given without the full parameter DIX will display the number of extents in the format \extents if /extent=full is specified, or if the /FHDRS qualifier is also given DIX will show both the header count and the number of extents in the format headers\extents See also the /FHDRS qualifier
Display the number of file headers in the format headers\ See also the help about /extent
Directory can also do a fast search (using /fast). In this case DIX will try to open the DEVICE:[000000]INDEXF.SYS (like DFU). You must have read access to this file Directory /fast device:[directory]filenamemask By default DIX will sort the resulting files by directory/filename to get a nice display (files per directory). But this may take some time (first all files must be processed before the first output appears). If you specify /nosort DIX will print the files as soon as they are found but the display is set to /nohead/notrail, since files are no longer sorted by directory. Relative files versions also work, but only if you do not specify /nosort
Display the fileid of the file
Display full info of a file
Display a line containing the grand total (over all directories), but no files, and also no directory names
Display the headers (one for each new directory)
If you specify a /before or /since, the date will be checked against the modification date
If the filename is ODS-5 with ^* escapes, DIX will transform the ^* escapes to the real meaning. This transform is done before the possible sorting.
Display the file organization
/output=filename Redirect the output to a file
Display the owner of the file
Display the data one page at the time
Display the record format
Display the data in screen mode
/SELECT=(sel_item[,sel_item...]) Sel_item can be select_file=name Set the default search pattern from a select_file definition, see add select for more help. You can add to or remove from the select_file by adding additional qualifiers See the example below size=min=blocks Select on file size (EOF) size=max=blocks allsize=min=blocks Select on file size (Allocated) allsize=max=blocks size=unused[=size] Select file where alloc-eof>size size is default the disk cluster size version=min=version_number Select on version number version=max=version_number organization=org Org=IDX,REL,SEQ,SYMLINK record_format=fmt fmt=UDF,FIX,VAR,VFC,STREAM,STREAM_LF,STREAM_CR headers=min=count Select on the number of headers headers=max=count extents=min=count Select on the number of mapping extents extents=max=count global_buffers=min=count Select on global buffer settings global_buffers=max=count aces=count=min=count Select on number of ACEs aces=count=max=count aces=size=min=count Select on size of ACEs aces=size=max=count aces=ident=(id1[:access][,id2[:access]..) Select on files that have ACEs with identifier id1,id2.. Any id will match (or). If you also specify aces=all, all IDs must be present. Access can be specified as any combination of RWDEC. All the letters specified must be in the ACE and no more. If you append an *, you select all ACEs that have at least the letters. aces=all In combination with the above. Match only if all IDs are present in the ACL lbn=(start[,end]) Select files that are mapped on LBNs between start and end. If end is not specified, end=start journal=(flag,flag..) Select files with journal attributes Flag can be journal Select journal files ai Select files that have AI journaling enabled bi Select files that have BI journaling enabled ru Select files that have RU recovery enabled If you do not specify any flag, all above files will be found flag=(flag[,flag]..) Flag can be nobackup Select files flagged as NOBACKUP locked Select files flagged as locked nomovefile Select files flagged as movefile disabled wbcache Select files flagged as write back cache readverify Select files flagged as readcheck writeverify Select files flagged as writecheck badacl Select files flagged as having a bad ACL badblock Select files flagged as containing a bad block nocharge Select files flagged as not charged to quota erase Select files flagged as erase on delete directory Select files flagged as directory file markdelete Select files flagged as marked for delete file=option (do not) Display parts of the filename Option can be [no]node [no]device [no]directory [no]name [no]type [no]version Examples for the ACEs: /SELECT=ACES=(IDENT=(ID1,BATCH),ALL) Select only files that have an ACE with ID1 AND an ACE with BATCH /SELECT=ACES=IDENT=(ID1,BATCH) Select only files that have an ACE with ID1 OR an ACE with BATCH /SELECT=ACES=COUNT=MIN=10 Select only files that have at least 10 ACEs /SELECT=ACES=(IDENT=ID1:RWE) Select all files that have an ACE (ID=ID1,ACCESS=R+W+E) files that have other access fields enabled are not selected. but other ACEs may be present /SELECT=ACES=(IDENT=ID1:R*) Select all files that have an ACE ID=ID1 with an ACCESS string that has at least a READ specified, other access are allowed. Example for select_file: DIX> Add select_file patt/select=size=(min=10,max=20) !add a select pattern DIX> direc/select=select=patt !show all files between 10 and 20 blocks DIX> direc/select=select=patt/by_own=system !add an extra selection DIX> direc/select=(select=patt,size=nomin) !now show files between 0 and 20 ! blocks
/since=date Display only files older than 'date' See the info about /create /expired /modified and /backup date can be a normal OpenVMS-date (including today, yesterday, tomorrow) or one of the keywords created/expired/modified/backup
/SIZE=(keyword[,keyword...]) Support keywords are all Display used size and allocated size allocation Display only allocated size used Display only used size, default if only /SIZE bytes Display the size not in blocks but in xB (x=K,M,G) exact Display the size in bytes, exact for sequential files The normal DCL syntax /size=units=bytes /size=units=blocks /size=units=exact Are also supported
/sort=(field[,field...]]) Sort the files according to the selected items field can be ascending The following sorts will be in ascending order descending The following sorts will be in descending order case_blind Text compares will case blind directory Sort on directory file Sort on the filename only type Sort on the file type version Sort on the file version date[=created|expired|maodified|backup] Sort on one of the dates created is default id Sort on fileid owner Sort on UIC organization Sort on file organization (SEQ,REL,IDX) record_format Sort on record format (DIX,STREAM,STREAM_LF,STREAM_CR,VAR,VFC,UDF) size[=allocated|used] Sort on size, default is used headers Sort on the number of headers extents Sort on the number of extents For header/extents you need read access to the index file If the /header or /trailer is active (Default), the sort is done within each directory. If you specify /noheader/notrailer, the sort is done over all files (including the directory) If you have specified /fast, you can also specify /nosort to prevent DIX from sorting the files (and thus print the files sooner). DIX uses a special compare routine for the sort operation and this is incompatible with the Hypersort utility. If you receive the message %SORT-E-NYI, functionality is not yet implemented when using directory/sort make sure that the logical SORTSHR does not exist or points to SYS$SHARE:SORTSHR Example: directory/sort=(ascending,type,descending,date=create) *.* Sort first on file type (ascending) and within equal types sort on creation date in descending order)