sources-request@mirror.UUCP (12/03/86)
Submitted by: David Albrecht <calmasd!dca@edison.GE.COM> Mod.sources: Volume 7, Issue 69 Archive-name: vms_tools/Part01 [ Not having access to VMS, I haven't tried these. --r$ ] #!/bin/sh # # The following files are VMS C programs which will # interface with VMS to provide some unix-like capabilities. # One file, (unixlike) gives a simplistic introduction to the # tools in 'roff format. # # Most of the files are well documented in comments at the # beginning as to their function and are totally stand alone. # # The file cd.com is a DCL script for the CD command under # VMS for those people who don't possess the C compiler. # # The file reset is a one line symbol definition which should # be added to a symbol definition file (ala. login.com) to add # a command (RESET) which will reset the JOB tracking system when # it goes astray. # # David Albrecht # # echo 'Start of vms, part 02 of 02:' echo 'x - cd.c' sed 's/^X//' > cd.c << '/' X#define NULL 0 X#define MAXSTRING 132 X X#include <ctype.h> X#include <rms.h> X#include <stdio.h> X#include <stsdef.h> X#include <ssdef.h> X#include <descrip.h> X Xstruct dsc$descriptor_s desc,desc1; X Xmain (argc,argv) X int argc; X char **argv; X X{ char curdir[MAXSTRING],testdir[MAXSTRING],todir[MAXSTRING]; X char *p1,*dirspec,*strpos(); X int i; X X if (argc <= 1) { X getlogical("SYS$LOGIN",todir); X if (chdir(todir,1)) { X invalid_dirspec(todir); X return(1); X } X } X else { X p1 = argv[1]; X if (strchr(p1,'[') X || strpos(p1,"..") X || strchr(p1,'/')) { X if (chdir(p1,1)) { X invalid_dirspec(p1); X return(1); X } X } X else if (getlogical(p1,todir)) { X if (chdir(p1,1)) { X invalid_dirspec(p1); X return(1); X } X } X else { X dirspec = strrchr(p1,':'); X if (!dirspec) { X *todir = '\0'; X dirspec = p1; X } X else { X i = dirspec-p1+1; X strncpy(todir,p1,i); X todir[i]='\0'; X dirspec++; X } X strcat(todir,"["); X if (*dirspec != '.' X && *dirspec != '-' X && dirspec == p1) strcat(todir,"."); X strcat(todir,dirspec); X strcat(todir,"]"); X if (chdir(todir,1)) { X invalid_dirspec(todir); X return(1); X } X } X } X} Xgetlogical(logical_name,value) Xchar *logical_name,*value; X{ int valuelen; X char cap_name[MAXSTRING],*cap_indx,*logical_indx; X X logical_indx = logical_name; X cap_indx = cap_name; X while (*cap_indx++ = toupper(*logical_indx++)); X setdesc(&desc,cap_name,strlen(cap_name)); X setdesc(&desc1,value,MAXSTRING-1); X valuelen = 0; X lib$sys_trnlog(&desc,&valuelen,&desc1,0,0,0); X value[valuelen] = '\0'; X if (!strcmp(cap_name,value)) { X return(0); X } X return(1); X X} Xgetsymbol(symbol_name,value) Xchar *symbol_name,*value; X{ int valuelen,status; X X setdesc(&desc,symbol_name,strlen(symbol_name)); X setdesc(&desc1,value,MAXSTRING-1); X valuelen = 0; X status = lib$get_symbol(&desc,&desc1,&valuelen,0); X if (status & STS$M_SUCCESS) { X value[valuelen] = '\0'; X return(1); X } X else { X return(0); X } X} Xgetwd(pwd) Xchar *pwd; X{ int pwdlen; X X setdesc(&desc,pwd,MAXSTRING-1); X pwdlen = 0; X sys$setddir(0,&pwdlen,&desc); X pwd[pwdlen] = '\0'; X} Xinvalid_dirspec(dirspec) Xchar *dirspec; X{ X fprintf(stderr,"invalid directory %s\n",dirspec); X} Xsetdesc(descr,str,strlen) Xstruct dsc$descriptor_s *descr; Xchar *str; Xint strlen; X{ X descr->dsc$w_length = strlen; X descr->dsc$a_pointer = str; X descr->dsc$b_class = DSC$K_CLASS_S; /* String desc class */ X descr->dsc$b_dtype = DSC$K_DTYPE_T; /* Ascii string type */ X} Xsetsymbol(symbol_name,value) Xchar *symbol_name,*value; X{ int valuelen; X X setdesc(&desc,symbol_name,strlen(symbol_name)); X setdesc(&desc1,value,strlen(value)); X lib$set_symbol(&desc,&desc1,0); X} X Xchar *strpos(str,searchstr) Xchar *str,*searchstr; X{ char *matchc,c,*matchstr; X X matchc = searchstr; X c = *matchc++; X while (c) { X if (!*str) { X return(NULL); X } X else { X matchstr = str++; X while (c == *matchstr && *matchstr++) { X c = *matchc++; X } X if (!c) { X return(str - 1); X } X matchc = searchstr; X c = *matchc++; X } X } X return(NULL); X} / echo 'x - cd.com' sed 's/^X//' > cd.com << '/' X$ if p1 .eqs. "\" then p1 := 'cd_last_dir' X$ if p1 .eqs. "" then p1 := 'f$logical("SYS$LOGIN")' X$ len = 'f$length(p1)' X$ if p1 .eqs. "[-]" then goto updir X$ if 'f$locate("[",p1)' .nes. len then goto setdef X$ if "''f$logical(p1)'" .nes. "" then goto chdir X$ if p1 .nes. ".." then goto chkroot X$ updir: X$ curdir := 'f$directory()' X$ if curdir .eqs. "[000000]" then goto nodir X$ p1 := "[-]" X$ goto chdir X$ chkroot: X$ if p1 .nes. "000000" then goto chksub X$ p1 := "[000000]" X$ goto chdir X$ chksub: X$ if 'f$locate(".",p1)' .eqs. len then p1 := .'p1' X$ p1 := "[''p1']" X$ setdef: X$ len = 'f$length(p1)' X$ end = 'f$locate("]",p1)' X$ beg = end - 1 X$ findbeg: X$ c := "''f$extract(beg,1,p1)'" X$ if c .eqs. "[" then goto dirbeg1 X$ if c .eqs. "." then goto dirbeg2 X$ beg = beg - 1 X$ goto findbeg X$ dirbeg1: X$ opendir := 'f$extract(0, beg + 1, p1)'"000000" X$ goto testdir X$ dirbeg2: X$ opendir := "''f$extract(0, beg, p1)'" X$ testdir: X$ opendir := 'opendir''f$extract(end, len - end, p1)''f$extract(beg + 1, end - beg - 1, p1)'".dir" X$ open/error=nodir dir 'opendir' X$ close dir X$ chdir: X$ cd_last_dir :== 'f$logical("SYS$DISK")''f$directory()' X$ set default 'p1' X$ set prompt='f$directory()'> X$ if p2 .nes. "" then cd "''p2'" "''p3'" "''p4'" X$ exit X$ nodir: X$ write sys$error "invalid directory" X$ exit / echo 'x - cdhash.c' sed 's/^X//' > cdhash.c << '/' X#define NULL 0 X#define MAXSTRING 132 X X#include <ctype.h> X#include <rms.h> X#include <stdio.h> X#include <stsdef.h> X#include <ssdef.h> X#include <descrip.h> X Xstruct dsc$descriptor_s desc,desc1; X Xmain (argc,argv) X int argc; X char **argv; X X{ char target[MAXSTRING],todir[MAXSTRING],dirlist[MAXSTRING]; X char dirname[MAXSTRING],*startname,*endname; X int i,context; X X if (!getsymbol("CDPATH",dirlist)) { X return(SS$_NORMAL); X } X else { X do { X startname = strrchr(dirlist,' '); X if (!startname) { X strcpy(todir,dirlist); X *dirlist = '\0'; X } X else { X strcpy(todir,startname+1); X do { X *(startname--) = '\0'; X } while (startname >= dirlist && startname == ' '); X } X strcat(todir,"*.dir"); X context = 0; X while (findfile(todir,target,&context)) { X endname = strchr(target,' '); X *endname = '\0'; X startname = strrchr(target,']')+1; X endname = strrchr(target,'.'); X i = endname-startname; X strncpy(dirname,startname,i); X dirname[i] = '\0'; X *(startname-1) = '\0'; X strcat(target,"."); X strcat(target,dirname); X strcat(target,"]"); X setlogical(dirname,target); X } X } while (*dirlist); X } X} Xfindfile(file_name,result_name,context) Xchar *file_name,*result_name; Xint *context; X{ int status; X X setdesc(&desc,file_name,strlen(file_name)); X setdesc(&desc1,result_name,MAXSTRING); X status = lib$find_file(&desc,&desc1,context,0,0,0,0); X if (status & STS$M_SUCCESS) { X return(1); X } X else { X return(0); X } X} Xgetlogical(logical_name,value) Xchar *logical_name,*value; X{ int valuelen; X char cap_name[MAXSTRING]; X X upshift(cap_name,logical_name); X setdesc(&desc,cap_name,strlen(cap_name)); X setdesc(&desc1,value,MAXSTRING-1); X valuelen = 0; X lib$sys_trnlog(&desc,&valuelen,&desc1,0,0,0); X value[valuelen] = '\0'; X if (!strcmp(cap_name,value)) { X return(0); X } X return(1); X X} Xgetsymbol(symbol_name,value) Xchar *symbol_name,*value; X{ int valuelen,status; X char cap_name[MAXSTRING]; X X upshift(cap_name,symbol_name); X setdesc(&desc,cap_name,strlen(cap_name)); X setdesc(&desc1,value,MAXSTRING-1); X valuelen = 0; X status = lib$get_symbol(&desc,&desc1,&valuelen,0); X if (status & STS$M_SUCCESS) { X value[valuelen] = '\0'; X return(1); X } X else { X return(0); X } X} Xsetdesc(descr,str,strlen) Xstruct dsc$descriptor_s *descr; Xchar *str; Xint strlen; X{ X descr->dsc$w_length = strlen; X descr->dsc$a_pointer = str; X descr->dsc$b_class = DSC$K_CLASS_S; /* String desc class */ X descr->dsc$b_dtype = DSC$K_DTYPE_T; /* Ascii string type */ X} Xsetlogical(logical_name,value) Xchar *logical_name,*value; X{ int valuelen; X char cap_name[MAXSTRING]; X X upshift(cap_name,logical_name); X setdesc(&desc,cap_name,strlen(cap_name)); X setdesc(&desc1,value,strlen(value)); X lib$set_logical(&desc,&desc1,0); X} Xupshift(upname,lwname) Xchar *upname,*lwname; X{ X while(*(upname++) = toupper(*(lwname++))); X} / echo 'x - popd.c' sed 's/^X//' > popd.c << '/' X#define NULL 0 X#define MAXSTRING 132 X X#include <rms.h> X#include <stdio.h> X#include <stsdef.h> X#include <ssdef.h> X#include <descrip.h> X Xstruct dsc$descriptor_s desc,desc1; X Xmain (argc,argv) X int argc; X char **argv; X X{ char dirlist[MAXSTRING],todir[MAXSTRING],*last_dir; X X if (!getlogical("dir_stack",dirlist)) { X invalid_pop(); X return(1); X } X else { X last_dir = strchr(dirlist,','); X if (!last_dir) { X strcpy(todir,dirlist); X *dirlist = '\0'; X } X else { X *last_dir = '\0'; X strcpy(todir,dirlist); X strcpy(dirlist,last_dir+1); X } X chdir_and_new_stack(todir,dirlist); X } X X} Xdellogical(logical_name) Xchar *logical_name; X{ char cap_name[MAXSTRING]; X X upshift(cap_name,logical_name); X setdesc(&desc,cap_name,strlen(cap_name)); X lib$delete_logical(&desc,0); X} Xdelsymbol(symbol_name) Xchar *symbol_name; X{ int tbl; X X setdesc(&desc,symbol_name,strlen(symbol_name)); X tbl = 2; X lib$delete_symbol(&desc,&tbl); X} Xgetlogical(logical_name,value) Xchar *logical_name,*value; X{ int valuelen; X char cap_name[MAXSTRING]; X X upshift(cap_name,logical_name); X setdesc(&desc,cap_name,strlen(cap_name)); X setdesc(&desc1,value,MAXSTRING-1); X valuelen = 0; X lib$sys_trnlog(&desc,&valuelen,&desc1,0,0,0); X value[valuelen] = '\0'; X if (!strcmp(cap_name,value)) { X return(0); X } X return(1); X X} Xgetsymbol(symbol_name,value) Xchar *symbol_name,*value; X{ int valuelen,status; X X setdesc(&desc,symbol_name,strlen(symbol_name)); X setdesc(&desc1,value,MAXSTRING-1); X valuelen = 0; X status = lib$get_symbol(&desc,&desc1,&valuelen,0); X if (status & STS$M_SUCCESS) { X value[valuelen] = '\0'; X return(1); X } X else { X return(0); X } X} Xinvalid_pop() X{ X fprintf(stderr,"empty stack\n"); X} Xsetdesc(descr,str,strlen) Xstruct dsc$descriptor_s *descr; Xchar *str; Xint strlen; X{ X descr->dsc$w_length = strlen; X descr->dsc$a_pointer = str; X descr->dsc$b_class = DSC$K_CLASS_S; /* String desc class */ X descr->dsc$b_dtype = DSC$K_DTYPE_T; /* Ascii string type */ X} Xsetlogical(logical_name,value) Xchar *logical_name,*value; X{ char cap_name[MAXSTRING]; X X upshift(cap_name,logical_name); X setdesc(&desc,cap_name,strlen(cap_name)); X setdesc(&desc1,value,strlen(value)); X lib$set_logical(&desc,&desc1,0); X} Xsetsymbol(symbol_name,value) Xchar *symbol_name,*value; X{ int tbl; X X setdesc(&desc,symbol_name,strlen(symbol_name)); X setdesc(&desc1,value,strlen(value)); X tbl = 2; X lib$set_symbol(&desc,&desc1,&tbl); X} Xupshift(upname,lwname) Xchar *upname,*lwname; X{ X while (*(upname++) = toupper(*(lwname++))); X} Xchdir_and_new_stack(todir,pushstack) Xchar *todir,*pushstack; X{ X if (*pushstack) { X setlogical("dir_stack",pushstack); X } X else { X dellogical("dir_stack"); X } X X printf("%s\n",todir); X chdir(todir,1); X} / echo 'Part 02 of vms complete.' exit