home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume7 / vms_tools / part01 next >
Encoding:
Internet Message Format  |  1986-12-02  |  11.7 KB

  1. Subject:  v07i069:  Unix-like tools for VMS systems, Part01/02
  2. Newsgroups: mod.sources
  3. Approved: mirror!rs
  4.  
  5. Submitted by: David Albrecht <calmasd!dca@edison.GE.COM>
  6. Mod.sources: Volume 7, Issue 69
  7. Archive-name: vms_tools/Part01
  8.  
  9. [  Not having access to VMS, I haven't tried these.  --r$  ]
  10.  
  11. #!/bin/sh
  12. #
  13. # The following files are VMS C programs which will
  14. # interface with VMS to provide some unix-like capabilities.
  15. # One file, (unixlike) gives a simplistic introduction to the
  16. # tools in 'roff format.
  17. # Most of the files are well documented in comments at the
  18. # beginning as to their function and are totally stand alone.
  19. # The file cd.com is a DCL script for the CD command under
  20. # VMS for those people who don't possess the C compiler.
  21. # The file reset is a one line symbol definition which should
  22. # be added to a symbol definition file (ala. login.com) to add
  23. # a command (RESET) which will reset the JOB tracking system when
  24. # it goes astray.
  25. # David Albrecht
  26. #
  27. echo 'Start of vms, part 02 of 02:'
  28. echo 'x - cd.c'
  29. sed 's/^X//' > cd.c << '/'
  30. X#define NULL 0
  31. X#define MAXSTRING 132
  32. X
  33. X#include <ctype.h>
  34. X#include <rms.h>
  35. X#include <stdio.h>
  36. X#include <stsdef.h>
  37. X#include <ssdef.h>
  38. X#include <descrip.h>
  39. X
  40. Xstruct dsc$descriptor_s desc,desc1;
  41. X
  42. Xmain (argc,argv)
  43. X    int argc;
  44. X    char **argv;
  45. X
  46. X{   char curdir[MAXSTRING],testdir[MAXSTRING],todir[MAXSTRING];
  47. X    char *p1,*dirspec,*strpos();
  48. X    int i;
  49. X
  50. X    if (argc <= 1) {
  51. X    getlogical("SYS$LOGIN",todir);
  52. X    if (chdir(todir,1)) {
  53. X        invalid_dirspec(todir);
  54. X        return(1);
  55. X    }
  56. X    }
  57. X    else {
  58. X    p1 = argv[1];
  59. X    if (strchr(p1,'[')
  60. X     || strpos(p1,"..")
  61. X     || strchr(p1,'/')) {
  62. X        if (chdir(p1,1)) {
  63. X        invalid_dirspec(p1);
  64. X        return(1);
  65. X        }
  66. X    }
  67. X    else if (getlogical(p1,todir)) {
  68. X        if (chdir(p1,1)) {
  69. X        invalid_dirspec(p1);
  70. X        return(1);
  71. X        }
  72. X    }
  73. X    else {
  74. X        dirspec = strrchr(p1,':');
  75. X        if (!dirspec) {
  76. X        *todir = '\0';
  77. X        dirspec = p1;
  78. X        }
  79. X        else {
  80. X        i = dirspec-p1+1;
  81. X        strncpy(todir,p1,i);
  82. X        todir[i]='\0';
  83. X        dirspec++;
  84. X        }
  85. X        strcat(todir,"[");
  86. X        if (*dirspec != '.'
  87. X         && *dirspec != '-'
  88. X         && dirspec == p1) strcat(todir,".");
  89. X        strcat(todir,dirspec);
  90. X        strcat(todir,"]");
  91. X        if (chdir(todir,1)) {
  92. X        invalid_dirspec(todir);
  93. X        return(1);
  94. X        }
  95. X    }
  96. X    }
  97. X}
  98. Xgetlogical(logical_name,value)
  99. Xchar *logical_name,*value;
  100. X{   int valuelen;
  101. X    char cap_name[MAXSTRING],*cap_indx,*logical_indx;
  102. X
  103. X    logical_indx = logical_name;
  104. X    cap_indx = cap_name;
  105. X    while (*cap_indx++ = toupper(*logical_indx++));
  106. X    setdesc(&desc,cap_name,strlen(cap_name));
  107. X    setdesc(&desc1,value,MAXSTRING-1);
  108. X    valuelen = 0;
  109. X    lib$sys_trnlog(&desc,&valuelen,&desc1,0,0,0);
  110. X    value[valuelen] = '\0';
  111. X    if (!strcmp(cap_name,value)) {
  112. X    return(0);
  113. X    }
  114. X    return(1);
  115. X
  116. X}
  117. Xgetsymbol(symbol_name,value)
  118. Xchar *symbol_name,*value;
  119. X{   int valuelen,status;
  120. X
  121. X    setdesc(&desc,symbol_name,strlen(symbol_name));
  122. X    setdesc(&desc1,value,MAXSTRING-1);
  123. X    valuelen = 0;
  124. X    status = lib$get_symbol(&desc,&desc1,&valuelen,0);
  125. X    if (status & STS$M_SUCCESS) {
  126. X    value[valuelen] = '\0';
  127. X    return(1);
  128. X    }
  129. X    else {
  130. X    return(0);
  131. X    }
  132. X}
  133. Xgetwd(pwd)
  134. Xchar *pwd;
  135. X{   int pwdlen;
  136. X
  137. X    setdesc(&desc,pwd,MAXSTRING-1);
  138. X    pwdlen = 0;
  139. X    sys$setddir(0,&pwdlen,&desc);
  140. X    pwd[pwdlen] = '\0';
  141. X}
  142. Xinvalid_dirspec(dirspec)
  143. Xchar *dirspec;
  144. X{
  145. X    fprintf(stderr,"invalid directory %s\n",dirspec);
  146. X}
  147. Xsetdesc(descr,str,strlen)
  148. Xstruct dsc$descriptor_s *descr;
  149. Xchar *str;
  150. Xint strlen;
  151. X{
  152. X    descr->dsc$w_length = strlen;
  153. X    descr->dsc$a_pointer = str;
  154. X    descr->dsc$b_class = DSC$K_CLASS_S;    /* String desc class */
  155. X    descr->dsc$b_dtype = DSC$K_DTYPE_T;    /* Ascii string type */
  156. X}
  157. Xsetsymbol(symbol_name,value)
  158. Xchar *symbol_name,*value;
  159. X{   int valuelen;
  160. X
  161. X    setdesc(&desc,symbol_name,strlen(symbol_name));
  162. X    setdesc(&desc1,value,strlen(value));
  163. X    lib$set_symbol(&desc,&desc1,0);
  164. X}
  165. X
  166. Xchar *strpos(str,searchstr)
  167. Xchar *str,*searchstr;
  168. X{   char *matchc,c,*matchstr;
  169. X
  170. X    matchc = searchstr;
  171. X    c = *matchc++;
  172. X    while (c) {
  173. X    if (!*str) {
  174. X        return(NULL);
  175. X    }
  176. X    else {
  177. X        matchstr = str++;
  178. X        while (c == *matchstr && *matchstr++) {
  179. X        c = *matchc++;
  180. X        }
  181. X        if (!c) {
  182. X         return(str - 1);
  183. X        }
  184. X        matchc = searchstr;
  185. X        c = *matchc++;
  186. X    }
  187. X    }
  188. X    return(NULL);
  189. X}
  190. /
  191. echo 'x - cd.com'
  192. sed 's/^X//' > cd.com << '/'
  193. X$    if p1 .eqs. "\"   then  p1 := 'cd_last_dir'
  194. X$    if p1 .eqs. ""    then    p1 := 'f$logical("SYS$LOGIN")'
  195. X$    len = 'f$length(p1)' 
  196. X$    if p1 .eqs. "[-]" then goto updir
  197. X$    if 'f$locate("[",p1)' .nes. len then goto setdef
  198. X$    if "''f$logical(p1)'" .nes. "" then  goto chdir
  199. X$    if p1 .nes. ".."  then goto chkroot
  200. X$ updir:
  201. X$    curdir := 'f$directory()'
  202. X$    if curdir .eqs. "[000000]" then goto nodir
  203. X$    p1 := "[-]"
  204. X$    goto chdir
  205. X$ chkroot:
  206. X$    if p1 .nes. "000000" then goto chksub
  207. X$    p1 := "[000000]"
  208. X$    goto chdir
  209. X$ chksub:
  210. X$    if 'f$locate(".",p1)' .eqs. len then p1 := .'p1'
  211. X$    p1 := "[''p1']"
  212. X$ setdef:
  213. X$    len = 'f$length(p1)'
  214. X$    end = 'f$locate("]",p1)'
  215. X$    beg = end - 1
  216. X$ findbeg:
  217. X$    c := "''f$extract(beg,1,p1)'"
  218. X$    if c .eqs. "[" then goto dirbeg1
  219. X$    if c .eqs. "." then goto dirbeg2
  220. X$    beg = beg - 1
  221. X$    goto findbeg
  222. X$ dirbeg1:
  223. X$    opendir := 'f$extract(0, beg + 1, p1)'"000000"
  224. X$    goto testdir
  225. X$ dirbeg2:
  226. X$    opendir := "''f$extract(0, beg, p1)'"
  227. X$ testdir:
  228. X$    opendir := 'opendir''f$extract(end, len - end, p1)''f$extract(beg + 1, end - beg - 1, p1)'".dir"
  229. X$    open/error=nodir dir 'opendir'
  230. X$    close dir
  231. X$ chdir:
  232. X$    cd_last_dir :== 'f$logical("SYS$DISK")''f$directory()'
  233. X$    set default 'p1'
  234. X$    set prompt='f$directory()'>
  235. X$    if p2 .nes. "" then cd "''p2'" "''p3'" "''p4'"
  236. X$    exit
  237. X$ nodir:
  238. X$    write sys$error "invalid directory"
  239. X$    exit
  240. /
  241. echo 'x - cdhash.c'
  242. sed 's/^X//' > cdhash.c << '/'
  243. X#define NULL 0
  244. X#define MAXSTRING 132
  245. X
  246. X#include <ctype.h>
  247. X#include <rms.h>
  248. X#include <stdio.h>
  249. X#include <stsdef.h>
  250. X#include <ssdef.h>
  251. X#include <descrip.h>
  252. X
  253. Xstruct dsc$descriptor_s desc,desc1;
  254. X
  255. Xmain (argc,argv)
  256. X    int argc;
  257. X    char **argv;
  258. X
  259. X{   char target[MAXSTRING],todir[MAXSTRING],dirlist[MAXSTRING];
  260. X    char dirname[MAXSTRING],*startname,*endname;
  261. X    int i,context;
  262. X
  263. X    if (!getsymbol("CDPATH",dirlist)) {
  264. X    return(SS$_NORMAL);
  265. X    }
  266. X    else {
  267. X    do {
  268. X        startname = strrchr(dirlist,' ');
  269. X        if (!startname) {
  270. X        strcpy(todir,dirlist);
  271. X        *dirlist = '\0';
  272. X        }
  273. X        else {
  274. X        strcpy(todir,startname+1);
  275. X        do {
  276. X           *(startname--) = '\0';
  277. X        } while (startname >= dirlist && startname == ' ');
  278. X        }
  279. X        strcat(todir,"*.dir");
  280. X        context = 0;
  281. X        while (findfile(todir,target,&context)) {
  282. X        endname = strchr(target,' ');
  283. X        *endname = '\0';
  284. X        startname = strrchr(target,']')+1;
  285. X        endname = strrchr(target,'.');
  286. X        i = endname-startname;
  287. X        strncpy(dirname,startname,i);
  288. X        dirname[i] = '\0';
  289. X        *(startname-1) = '\0';
  290. X        strcat(target,".");
  291. X        strcat(target,dirname);
  292. X        strcat(target,"]");
  293. X        setlogical(dirname,target);
  294. X        }
  295. X    } while (*dirlist);
  296. X    }
  297. X}
  298. Xfindfile(file_name,result_name,context)
  299. Xchar *file_name,*result_name;
  300. Xint *context;
  301. X{   int status;
  302. X
  303. X    setdesc(&desc,file_name,strlen(file_name));
  304. X    setdesc(&desc1,result_name,MAXSTRING);
  305. X    status = lib$find_file(&desc,&desc1,context,0,0,0,0);
  306. X    if (status & STS$M_SUCCESS) {
  307. X    return(1);
  308. X    }
  309. X    else {
  310. X    return(0);
  311. X    }
  312. X}
  313. Xgetlogical(logical_name,value)
  314. Xchar *logical_name,*value;
  315. X{   int valuelen;
  316. X    char cap_name[MAXSTRING];
  317. X
  318. X    upshift(cap_name,logical_name);
  319. X    setdesc(&desc,cap_name,strlen(cap_name));
  320. X    setdesc(&desc1,value,MAXSTRING-1);
  321. X    valuelen = 0;
  322. X    lib$sys_trnlog(&desc,&valuelen,&desc1,0,0,0);
  323. X    value[valuelen] = '\0';
  324. X    if (!strcmp(cap_name,value)) {
  325. X    return(0);
  326. X    }
  327. X    return(1);
  328. X
  329. X}
  330. Xgetsymbol(symbol_name,value)
  331. Xchar *symbol_name,*value;
  332. X{   int valuelen,status;
  333. X    char cap_name[MAXSTRING];
  334. X
  335. X    upshift(cap_name,symbol_name);
  336. X    setdesc(&desc,cap_name,strlen(cap_name));
  337. X    setdesc(&desc1,value,MAXSTRING-1);
  338. X    valuelen = 0;
  339. X    status = lib$get_symbol(&desc,&desc1,&valuelen,0);
  340. X    if (status & STS$M_SUCCESS) {
  341. X    value[valuelen] = '\0';
  342. X    return(1);
  343. X    }
  344. X    else {
  345. X    return(0);
  346. X    }
  347. X}
  348. Xsetdesc(descr,str,strlen)
  349. Xstruct dsc$descriptor_s *descr;
  350. Xchar *str;
  351. Xint strlen;
  352. X{
  353. X    descr->dsc$w_length = strlen;
  354. X    descr->dsc$a_pointer = str;
  355. X    descr->dsc$b_class = DSC$K_CLASS_S;    /* String desc class */
  356. X    descr->dsc$b_dtype = DSC$K_DTYPE_T;    /* Ascii string type */
  357. X}
  358. Xsetlogical(logical_name,value)
  359. Xchar *logical_name,*value;
  360. X{   int valuelen;
  361. X    char cap_name[MAXSTRING];
  362. X
  363. X    upshift(cap_name,logical_name);
  364. X    setdesc(&desc,cap_name,strlen(cap_name));
  365. X    setdesc(&desc1,value,strlen(value));
  366. X    lib$set_logical(&desc,&desc1,0);
  367. X}
  368. Xupshift(upname,lwname)
  369. Xchar *upname,*lwname;
  370. X{
  371. X    while(*(upname++) = toupper(*(lwname++)));
  372. X}
  373. /
  374. echo 'x - popd.c'
  375. sed 's/^X//' > popd.c << '/'
  376. X#define NULL 0
  377. X#define MAXSTRING 132
  378. X
  379. X#include <rms.h>
  380. X#include <stdio.h>
  381. X#include <stsdef.h>
  382. X#include <ssdef.h>
  383. X#include <descrip.h>
  384. X
  385. Xstruct dsc$descriptor_s desc,desc1;
  386. X
  387. Xmain (argc,argv)
  388. X    int argc;
  389. X    char **argv;
  390. X
  391. X{   char dirlist[MAXSTRING],todir[MAXSTRING],*last_dir;
  392. X
  393. X    if (!getlogical("dir_stack",dirlist)) {
  394. X    invalid_pop();
  395. X    return(1);
  396. X    }
  397. X    else {
  398. X    last_dir = strchr(dirlist,',');
  399. X    if (!last_dir) {
  400. X        strcpy(todir,dirlist);
  401. X        *dirlist = '\0';
  402. X    }
  403. X    else {
  404. X        *last_dir = '\0';
  405. X        strcpy(todir,dirlist);
  406. X        strcpy(dirlist,last_dir+1);
  407. X    }
  408. X    chdir_and_new_stack(todir,dirlist);
  409. X    }
  410. X    
  411. X}
  412. Xdellogical(logical_name)
  413. Xchar *logical_name;
  414. X{   char cap_name[MAXSTRING];
  415. X
  416. X    upshift(cap_name,logical_name);
  417. X    setdesc(&desc,cap_name,strlen(cap_name));
  418. X    lib$delete_logical(&desc,0);
  419. X}
  420. Xdelsymbol(symbol_name)
  421. Xchar *symbol_name;
  422. X{   int tbl;
  423. X
  424. X    setdesc(&desc,symbol_name,strlen(symbol_name));
  425. X    tbl = 2;
  426. X    lib$delete_symbol(&desc,&tbl);
  427. X}
  428. Xgetlogical(logical_name,value)
  429. Xchar *logical_name,*value;
  430. X{   int valuelen;
  431. X    char cap_name[MAXSTRING];
  432. X
  433. X    upshift(cap_name,logical_name);
  434. X    setdesc(&desc,cap_name,strlen(cap_name));
  435. X    setdesc(&desc1,value,MAXSTRING-1);
  436. X    valuelen = 0;
  437. X    lib$sys_trnlog(&desc,&valuelen,&desc1,0,0,0);
  438. X    value[valuelen] = '\0';
  439. X    if (!strcmp(cap_name,value)) {
  440. X    return(0);
  441. X    }
  442. X    return(1);
  443. X
  444. X}
  445. Xgetsymbol(symbol_name,value)
  446. Xchar *symbol_name,*value;
  447. X{   int valuelen,status;
  448. X
  449. X    setdesc(&desc,symbol_name,strlen(symbol_name));
  450. X    setdesc(&desc1,value,MAXSTRING-1);
  451. X    valuelen = 0;
  452. X    status = lib$get_symbol(&desc,&desc1,&valuelen,0);
  453. X    if (status & STS$M_SUCCESS) {
  454. X    value[valuelen] = '\0';
  455. X    return(1);
  456. X    }
  457. X    else {
  458. X    return(0);
  459. X    }
  460. X}
  461. Xinvalid_pop()
  462. X{
  463. X    fprintf(stderr,"empty stack\n");
  464. X}
  465. Xsetdesc(descr,str,strlen)
  466. Xstruct dsc$descriptor_s *descr;
  467. Xchar *str;
  468. Xint strlen;
  469. X{
  470. X    descr->dsc$w_length = strlen;
  471. X    descr->dsc$a_pointer = str;
  472. X    descr->dsc$b_class = DSC$K_CLASS_S;    /* String desc class */
  473. X    descr->dsc$b_dtype = DSC$K_DTYPE_T;    /* Ascii string type */
  474. X}
  475. Xsetlogical(logical_name,value)
  476. Xchar *logical_name,*value;
  477. X{   char cap_name[MAXSTRING];
  478. X
  479. X    upshift(cap_name,logical_name);
  480. X    setdesc(&desc,cap_name,strlen(cap_name));
  481. X    setdesc(&desc1,value,strlen(value));
  482. X    lib$set_logical(&desc,&desc1,0);
  483. X}
  484. Xsetsymbol(symbol_name,value)
  485. Xchar *symbol_name,*value;
  486. X{   int tbl;
  487. X
  488. X    setdesc(&desc,symbol_name,strlen(symbol_name));
  489. X    setdesc(&desc1,value,strlen(value));
  490. X    tbl = 2;
  491. X    lib$set_symbol(&desc,&desc1,&tbl);
  492. X}
  493. Xupshift(upname,lwname)
  494. Xchar *upname,*lwname;
  495. X{
  496. X    while (*(upname++) = toupper(*(lwname++)));
  497. X}
  498. Xchdir_and_new_stack(todir,pushstack)
  499. Xchar *todir,*pushstack;
  500. X{
  501. X    if (*pushstack) {
  502. X    setlogical("dir_stack",pushstack);
  503. X    }
  504. X    else {
  505. X    dellogical("dir_stack");
  506. X    }
  507. X
  508. X    printf("%s\n",todir);
  509. X    chdir(todir,1);
  510. X}
  511. /
  512. echo 'Part 02 of vms complete.'
  513. exit
  514.  
  515.  
  516.