OpenVMS Source Code Demos

VMS_LOGICAL_NAMES.BAS

1000	%title "vms_basic_logical_names_xxx.bas"
	%ident "version_100.1"
	!
	!0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
	!1         2         3         4         5         6         7         8         9         0         1         2         3
	!=========================================================================================================================
	! Title  : vms_basic_logical_names_xxx.bas
	! Author : Neil S. Rieck (Waterloo, Ontario, Canada)
	! Purpose: demoes logical name manipulation only using SYS$ calls
	! History:
	! 100 NSR 991126 1. original program
	!=========================================================================================================================
	! notes:
	! 1. to hack the 'STARLET' system library, do the following from DCL (need ~7000 blocks):
	!
	!  command                                       description
	!  =======                                       ===========
	!  $set def sys$login                            (go to your home directory)
	!  $lib/ext=* sys$library:basic$starlet.tlb/text (copy text from 'text libary' to 'text file')
	!  $edit/read/edt basic$starlet.txt              (edit large text file using EDT)
	!=========================================================================================================================
	option type=explicit							! no kid stuff
	!
	%include "starlet"	%from %library "sys$library:basic$starlet"	! system services (calls)
	%include "$ssdef"	%from %library "sys$library:basic$starlet"	! ss$ definitions
	%include "lib$routines"	%from %library "sys$library:basic$starlet"	! lib$ routines (calls)
	%include "$libclidef"	%from %library "sys$library:basic$starlet"	! lib$ cli definitions
	%include "$lnmdef"	%from %library "sys$library:basic$starlet"      ! lnm$
	%include "$psldef"	%from %library "sys$library:basic$starlet"      ! psl$
	!
	!
	record ItemListRec							! structure of item record
	    variant								! similar to a union in "c"
		case
		    group one
			word	BuffLen
			word	ItemCode
			long	BuffAddr
			long	RtnLenAdr
		    end group one
		case
		    group two							! this is overlayed over group one
			long	List_Terminator
			long	Junk1
			long	Junk2
		    end group two
	    end variant
	end record ItemListRec
	!
	declare ItemListRec MyList(9)						! expand or contract list length as required
	!
	declare ItemListRec MyList						! this is the variable declaration
	map(xyz)string	Equiv_Name$	= 255%					! equiv values can't be bigger than 255
	declare long	bytes_returned%	,					!			&
			my_attributes%	,					!			&
			my_test%	,					!			&
			rc%		,					!			&
		string	table_name$	,					!			&
			logical_name$	,					! 			&
			stuff$		,					!			&
		byte	access_mode%						!
	!
	access_mode%	= PSL$C_SUPER						! either SUPER or USER is all we need
!	my_attributes% = LNM$M_TERMINAL						x incase we want to specify this
	!
	!	<<< create/update a logical name >>>
	!
	print "-i- calling sys$crelnm to create/update logical name"
	table_name$	= "LNM$PROCESS_TABLE"
	logical_name$	= "EXAMPLE1"					! must be upper case
	Equiv_Name$	= "yada"
	MyList(0)::BuffLen		= len(edit$(Equiv_Name$,2))	! compute length of mapped string
	MyList(0)::ItemCode		= lnm$_String			! desired code
	MyList(0)::BuffAddr		= loc(Equiv_Name$)		!
	MyList(0)::RtnLenAdr		= 0				! don't care
	MyList(1)::List_Terminator	= 0%				! signal end-of-list
	!
	!	SYS$CRELNM [attr] ,tabnam ,lognam ,[acmode] ,[itmlst]
	!
	rc% = sys$crelnm(						! attributes	&
					,table_name$			! table name	&
					,logical_name$			! logical name	&
					,access_mode%			! access mode	&
					,MyList()		)	! argument list
	gosub display_rc
	!
	!	<<< read a logical name >>>
	!
	print ">>> calling sys$trnlnm to read 'test_name'"
	table_name$	= "LNM$PROCESS_TABLE"
	logical_name$	= "EXAMPLE1"					! must be upper case
	MyList(0)::BuffLen	= len(Equiv_Name$)			!
	MyList(0)::ItemCode	= lnm$_String				! desired code
	MyList(0)::BuffAddr	= loc(Equiv_Name$)			!
	MyList(0)::RtnLenAdr	= loc(Bytes_Returned%)			!
	!
	MyList(1)::List_Terminator	= 0%				! signal end-of-list
	!
	rc% = sys$trnlnm(						! attributes	&
					,table_name$			! table name	&
					,logical_name$			! logical name	&
					,access_mode%			! access mode	&
					,MyList()		)	! argument list
	gosub display_rc
	print "-i-Logical Name: ";logical_name$
	!
	select rc%
	    case ss$_nolognam
		stuff$ = ""
		print "-e-No Such Logical"
	    case ss$_normal
		stuff$ = left$(Equiv_Name$, bytes_returned%)
		print "-i-Equiv Name: ";stuff$
	    case else
		print "rc: "+str$(rc%)
	end select
	!
	!	<<< delete logical name >>>
	!
	!	SYS$DELLNM tabnam ,[lognam] ,[acmode]
	!
	print "-i- calling sys$dellnm to delete logical name"
	rc% = sys$dellnm(table_name$, logical_name$, access_mode%)
	gosub display_rc
	!
	goto fini								! adios...
	!------------------------------------------------------------------------------------------------------------------------
	!	<<< display VMS severity and return code >>>
	!------------------------------------------------------------------------------------------------------------------------
	display_rc:
	select (rc% and 7%)
	    case 0%
		print "-w-";
	    case 1%
		print "-s-";
	    case 2%
		print "-e-";
	    case 3%
		print "-i-";
	    case 4%
		print "-f-";
	    case else
		print "-?-";
	end select
	print " rc: ";str$(rc%)
	return
	!------------------------------------------------------------------------------------------------------------------------
	!	<<< that's all folks >>>
	!------------------------------------------------------------------------------------------------------------------------
	fini:
	end

Back to Home
Neil Rieck
Waterloo, Ontario, Canada.