home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1998 April A / Pcwk4a98.iso / Wtestowe / OnNet16 / LIBRARY.SCR < prev    next >
Text File  |  1997-01-08  |  11KB  |  369 lines

  1. *---------------------------------------------------------------------*
  2. *          "LIBRARY.SCR" : Relay/PC Gold Library Creation             *
  3. *---------------------------------------------------------------------*
  4. *
  5. *  (c) Copyright 1983,1993 RELAY Technology Inc.
  6. *
  7. * This program creates a Library file for use with Relay/PC Gold.
  8. * The user is prompted for the library fileid and the member
  9. * list fileid.
  10. *
  11. * Supplied arguments (optional) are:
  12. *    &1 = Library fileid
  13. *    &2 = List fileid
  14. *    &3+= Options:
  15. *         "QUIET" to execute quietly, without messages
  16. *         "APPEND" or "ADD" to add to an existing library
  17. *         "STRIP" to run STRIPSCR on members added
  18. *
  19. * Member-list records have the form:
  20. *
  21. *     1) d:filename.ext - for a new member
  22. *
  23. *     2) aliasname=membername - to define an alias
  24. *
  25. *     3) + minsp align - to align size to multiple of "align",
  26. *                reserving an least "minsp".
  27. *
  28. *     4) /name  args   - to execute script "name" before continuing.
  29. *
  30. * Notes:
  31. *
  32. *     1) The member files must reside on the same directory as
  33. *        the list file (the second argument).
  34. *
  35. *---------------------------------------------------------------------*
  36. *                 Module History                  *
  37. *---------------------------------------------------------------------*
  38. *                                      *
  39. *  Latest Revision -                              *
  40. *                                      *
  41. *     $Revision:   1.8  $                          *
  42. *                                      *
  43. *  Modification Log -                              *
  44. *                                      *
  45. *     M0001V70 Put Relay Source Files under PVCS Control          *
  46. *          by JMM on 12/18/95                      *
  47. *                                      *
  48. *---------------------------------------------------------------------*
  49.  
  50. *
  51. *     on error
  52.      on nomemory stop error "WInsufficient memory to run &0!"
  53. *
  54. *     Initialize variables
  55. *
  56.      &OUTFILE = &1               ;* Library fileid (output file)
  57.      &LISTFILE = &2            ;* List fileid (input file)
  58.      &OUTSIZE=0               ;* Accumulated size of output file
  59.      &MFILE=""                     ;* Member fileid
  60.      &MNAME=""                     ;* Member name
  61.      &LSTCNT=0               ;* Count of member list items
  62.      &DIRCNT=0               ;* Count of actual directory entries
  63.      &DIRFST=0               ;* Record offset to write directory at
  64.      &LSTCNT=0               ;* Current member list item
  65.      &ENTNUM=0               ;* Alternate directory entry number
  66.      &INPFN0=""                    ;* Array is list of file names
  67.      &DIRMN1=""                    ;* Array is list of member names
  68.      &DIRNO1=0               ;* Array is member offset in file
  69.      &DIRLN1=0               ;* Array is length of member
  70.      &QUIET = NO               ;* Execute quietly?
  71.      &APPEND=NO               ;* Appending to existing library?
  72.      &MAXMEM=999999            ;* Maximum members allowed to add
  73.      &STRIPM=NO               ;* Strip members?
  74.      &TMPID="&FDIR(&DOSENV(TMP))$$LIB$$.SCX" ;* A temporary fileid
  75.      &LONGMSG="";&TOTLINES=0
  76.  
  77. *
  78. *     Introduction & prompts
  79. *
  80.      &ARG = 2
  81. -OPT1     &ARG=&ARG+1
  82.      if (&ARG>&N) goto -OPT2
  83.      if (&&ARG~"QUIET") &QUIET="YES" ; goto -OPT1
  84.      if (&&ARG~"APPEND") &APPEND="YES" ; goto -OPT1
  85.      if (&&ARG~"ADD") &APPEND="YES" ; goto -OPT1
  86.      if (&&ARG~"STRIP") &STRIPM="YES" ; goto -OPT1
  87.      stop error "W&0 - Invalid option: &&ARG"
  88. -OPT2
  89.  
  90.      if (&QUIET="YES") goto -SKIP1
  91.      if (&WHERE<>"OFF") and (&WHERE<>"BATCH") goto -SKIP1
  92.      CLEAR
  93. -SKIP1
  94.  
  95.      IF (&OUTFILE<>"") GOTO -CHECK1
  96. -ASK1     if (&QUIET="YES") stop 99
  97.      display dialogbox INPUT "Library Utility" "Enter the fileid for the Library to be created: " &OUTFILE
  98.      IF (&OUTFILE="") STOP 99 "INo library created!"
  99. -CHECK1  &OUTFILE=&UPPER(&TRIM(&OUTFILE))
  100.      IF NOT VALID &OUTFILE GOTO -ASK1
  101.  
  102.      IF (&LISTFILE<>"") GOTO -CHECK2
  103. -ASK2     if (&QUIET="YES") stop 99
  104.      display dialogbox INPUT "Library Utility" "Enter the fileid for the list of members: " &LISTFILE
  105.      IF (&LISTFILE="") STOP 99 "INo library created!"
  106. -CHECK2  &LISTFILE=&UPPER(&TRIM(&LISTFILE))
  107.      IF NOT VALID &LISTFILE GOTO -ASK2
  108.  
  109. *
  110. *     If we are appending to an existing library, we must have
  111. *     space between the end of the directory and the first member.
  112. *
  113.      if (&APPEND<>"YES") goto -OLD1
  114.      OPEN &OUTFILE AS #2 LENGTH 16 BINARY
  115.      FIELD #2 1 8 &DIRMN&LSTNUM CHAR
  116.      FIELD #2 * 2 &DIRNO&LSTNUM DEC
  117.      FIELD #2 * 2 &DIRLN&LSTNUM DEC
  118.      &LSTNUM = 1
  119.      read record #2
  120.      &LSTNUM = 0
  121.      read record #2
  122.      close #2
  123.  
  124.      &OUTSIZE = &DIRNO1*16
  125.      &DIRFST = &DIRLN1+1
  126.      &MAXMEM = &DIRNO0-&DIRFST
  127. -OLD1
  128.  
  129. *
  130. *     The first directory entry is a library identifier
  131. *
  132.      &MFILE = "PDSDIR"
  133.      GOSUB -ADDMEM
  134.  
  135. *
  136. *     Process the List File (read member names)
  137. *
  138.      OPEN &LISTFILE AS #1 FOR INPUT
  139.      &MEMDRV = &FDIR(&LISTFILE)
  140.      READ FILE #1 &MFILE
  141.  
  142.      LOOP -RDLST WHILE FOUND
  143.      IF (&LEFT(&MFILE,1)<>"*") GOSUB -ADDMEM
  144.      then if (&RC>0) goto -BADMEM
  145. -RDLST     READ FILE #1 &MFILE
  146.  
  147.      CLOSE #1
  148.  
  149.      if (&DIRCNT-1>&MAXMEM) stop 97 "ENo room left in library directory for append!"
  150.  
  151. *
  152. *    Begin Library Creation: Reserve space for the directory.
  153. *
  154.      if (&APPEND="YES") &AS = "APPEND" ; else &AS = "OUTPUT"
  155.      OPEN &OUTFILE AS #2 FOR &AS STREAM BINARY BUFFERSIZE 4096
  156.  
  157.      if (&APPEND="YES") goto -PREDIR1
  158.      LOOP *+1 &DIRCNT
  159.        WRITE FILE #2 &STRING(&NULL,16)
  160.  
  161.      &OUTSIZE = &OUTSIZE+16*&DIRCNT
  162. -PREDIR1
  163.  
  164. *
  165. *     Add members to the library.
  166. *
  167.      gosub -TYPEIT "Adding members ..."
  168.  
  169.      global &STRIPID           ;* Used by STRIPSCR.EDS
  170.  
  171.      &LSTNUM = 2
  172.      LOOP -COPIED &LSTCNT-1
  173.      &MFILE = &INPFN&LSTNUM
  174.      &MNAME = &DIRMN&LSTNUM
  175.      IF (&LEFT(&MNAME,1)="+") GOTO -RESERVE
  176.      IF (&LEFT(&MNAME,1)="/") GOTO -EXECSCR
  177.      IF (&LEFT(&MFILE,1)="=") GOTO -CALIAS
  178.  
  179.      &MFILE = &MEMDRV.&MFILE
  180.      if (&STRIPM="YES")
  181.        then copyfile &MFILE &TMPID
  182.        then &STRIPID = &fileid(&MFILE)
  183.        then edit &TMPID nodisplay exec stripscr.eds
  184.        then &MFILE = &TMPID
  185.  
  186.      &DIRNO&LSTNUM = &OUTSIZE/16
  187.      &DIRLN&LSTNUM = &FSIZE(&MFILE)
  188.      &AT = "&RIGHT(000&HEX(&DIRNO&LSTNUM)0,5)h"
  189.      gosub -TYPEIT "&MNAME   (offset &AT length &DIRLN&LSTNUM)"
  190.      if (&DIRLN&LSTNUM>65535) GOTO -TOOBIG
  191.      OPEN &MFILE AS #1 FOR INPUT STREAM BINARY BUFFERSIZE 4096
  192.      READ FILE #1 &RECORD
  193.  
  194.      LOOP *+2 WHILE FOUND
  195.        WRITE FILE #2 &RECORD
  196.        READ FILE #1 &RECORD
  197.  
  198.      CLOSE #1
  199.      &OUTSIZE = &OUTSIZE+&DIRLN&LSTNUM
  200.      &LEFTOVER = 16-(&DIRLN&LSTNUM\16)
  201.      IF (&LEFTOVER<16) WRITE FILE #2 &STRING(&NULL,&LEFTOVER)
  202.              THEN &OUTSIZE=&OUTSIZE+&LEFTOVER
  203.      if (&STRIPM="YES") erase &TMPID
  204.      GOTO -COPIED
  205.  
  206. -CALIAS  &MFILE = &SUBSTR(&MFILE,2)
  207.      GOSUB -LOOKUP
  208.      &DIRNO&LSTNUM = &DIRNO&ENTNUM
  209.      &DIRLN&LSTNUM = &DIRLN&ENTNUM
  210.      gosub -TYPEIT "&MNAME = &DIRMN&ENTNUM"
  211.      GOTO -COPIED
  212.  
  213. -RESERVE &MNAME = &substr(&MNAME,2)
  214.      argstring &MNAME
  215.      &RESERVE = 0
  216.      if (&OUTSIZE\&2>0)     gosub -RWRITE &CALC(&2-(&OUTSIZE\&2))
  217.      if (&RESERVE<&1)     gosub -RWRITE &CALC(&1-&RESERVE)
  218.      then if (&OUTSIZE\&2>0) gosub -RWRITE &CALC(&2-(&OUTSIZE\&2))
  219.      gosub -typeit "+ &RESERVE"
  220.      GOTO -COPIED
  221.  
  222. -EXECSCR sub command quiet exec &substr(&MNAME,2)
  223.      if (&RC>0) &RTC = &RC ; close #2 ; stop &RTC
  224.  
  225. -COPIED  &LSTNUM = &LSTNUM+1
  226.  
  227.      CLOSE #2
  228.  
  229. *
  230. *     Write the Library Directory
  231. *
  232.      &DIRNO1 = &OUTSIZE/16
  233.      &DIRLN1 = &DIRLN1+&DIRCNT-1
  234.  
  235.      OPEN &OUTFILE AS #2 LENGTH 16 BINARY
  236.      FIELD #2 1 8 &DIRMN&LSTNUM CHAR
  237.      FIELD #2 * 2 &DIRNO&LSTNUM DEC
  238.      FIELD #2 * 2 &DIRLN&LSTNUM DEC
  239.      FIELD #2 * 4 &NULL
  240.  
  241.      &LSTNUM = 1
  242.      if (&APPEND="YES") point #2 1 ; WRITE RECORD #2 ; point #2 &DIRFST+1
  243.                then &LSTNUM=2 ; &LSTCNT=&LSTCNT-1
  244.  
  245.      LOOP -WRTDIR &LSTCNT
  246.      &MFILE = &INPFN&LSTNUM
  247.      IF (&LEFT(&MFILE,1)="+") GOTO -WRTDIR
  248.      IF (&LEFT(&MFILE,1)="/") GOTO -WRTDIR
  249.      WRITE RECORD #2
  250. -WRTDIR  &LSTNUM = &LSTNUM+1
  251.  
  252.      CLOSE #2
  253.  
  254. *
  255. *     Library Creation is complete
  256. *
  257.      gosub -TYPEIT
  258.      display dialogbox OK 'Library Utility' "Library &OUTFILE has been created from &DIRLN1 members."
  259.      &RTC = 0
  260.  
  261. -EXIT     reset &STRIPID
  262.      STOP &RTC
  263.  
  264. *
  265. *     Error: Invalid member list
  266. *
  267. -BADMEM  close #1
  268.      display dialogbox OK "Invalid member list file: &LISTFILE"
  269.      &RTC = 98
  270.      goto -EXIT
  271.  
  272. *
  273. *     Error: Library is too large
  274. *
  275. -TOOBIG  close #2
  276.      display dialogbox OK "Library or library member is too large!"
  277.      &RTC = 98
  278.      goto -EXIT
  279.  
  280. *---------------------------------------------------------------------*
  281. *         Subroutine to add member name to list              *
  282. *---------------------------------------------------------------------*
  283.  
  284. -ADDMEM  &MFILE = &UPPER(&TRIM(&MFILE))
  285.      &LSTCNT = &LSTCNT+1
  286.      IF (&LEFT(&MFILE,1)="+") GOTO -ARESERV
  287.      IF (&LEFT(&MFILE,1)="/") GOTO -AEXECSC
  288.      &DIRCNT = &DIRCNT+1
  289.      &POSN = &INSTR(&MFILE,"=",1)
  290.      IF (&POSN>0) GOTO -AALIAS
  291.      &MNAME = &MFILE
  292.      &POSN = &INSTR(&MNAME,":",1)
  293.      IF (&POSN>0) &MNAME = &SUBSTR(&MNAME,&POSN+1)
  294.      &POSN = &INSTR(&MNAME,".",1)
  295.      IF (&POSN>0) &MNAME = &SUBSTR(&MNAME,1,&POSN-1)
  296.      &DIRMN&LSTCNT = &LEFT(&MNAME,8)
  297.      &INPFN&LSTCNT = &MFILE
  298.      RETURN 0
  299.  
  300. -AALIAS  &MNAME = &SUBSTR(&MFILE,1,&POSN-1)
  301.      &DIRMN&LSTCNT = &LEFT(&MNAME,8)
  302.      &INPFN&LSTCNT = &SUBSTR(&MFILE,&POSN)
  303.      RETURN 0
  304.  
  305. -AEXECSC &DIRMN&LSTCNT = &MFILE
  306.      &INPFN&LSTCNT = "/"
  307.      return 0
  308.  
  309. -ARESERV &MFILE = &substr(&MFILE,2)
  310.      argstring &MFILE
  311.      if (&n<>2) return 1
  312.      if (&DATATYPE(&1)<>NUM) return 1
  313.      if (&DATATYPE(&2)<>NUM) return 1
  314.      &DIRMN&LSTCNT = "+ &1 &2"
  315.      &INPFN&LSTCNT = "+"
  316.      return 0
  317.  
  318. *---------------------------------------------------------------------*
  319. *           Subroutine to lookup name in member list           *
  320. *---------------------------------------------------------------------*
  321.  
  322. -LOOKUP  &ENTNUM = 2
  323.  
  324.      LOOP *+2 &LSTCNT-1
  325.        IF (&TRIM(&DIRMN&ENTNUM)=&MFILE) RETURN
  326.        &ENTNUM = &ENTNUM+1
  327.  
  328.      &ENTNUM = 0
  329.      RETURN
  330.  
  331. *---------------------------------------------------------------------*
  332. *               Subroutine to type a line              *
  333. *---------------------------------------------------------------------*
  334.  
  335. -TYPEIT  if (&QUIET="YES") return
  336.      if (&WHERE<>"OFF") and (&WHERE<>"BATCH") return
  337. *     type "&1"
  338.  
  339. * If total lines in dialogbox less than 5, then append message
  340.      if (&TOTLINES<5) then &LONGMSG=&LONGMSG.&1&lf
  341.      then &TOTLINES=&TOTLINES+1
  342.      then goto DISP1
  343.  
  344. * Otherwise, remove first message to make room for next message
  345.      &POS = &instr(&LONGMSG,&lf)
  346.      if (&POS>0) then &LONGMSG=&substr(&LONGMSG,&POS+1)
  347.      &LONGMSG=&LONGMSG.&1&lf
  348.      &TOTLINES=&TOTLINES+1
  349.  
  350. -DISP1
  351.      display dialogbox infomessage "Library Utility" "&LONGMSG"
  352.      return
  353.  
  354. *---------------------------------------------------------------------*
  355. *          Subroutine to write reserved space              *
  356. *---------------------------------------------------------------------*
  357.  
  358. -RWRITE  &WSIZE = &1
  359.      &CHUNK = 256
  360.      &RESERVE = &RESERVE+&WSIZE
  361.  
  362.      loop -RCHUNK while (&WSIZE>0)
  363.      if (&CHUNK>&WSIZE) &CHUNK=&WSIZE
  364.      write file #2 &string(&null,&CHUNK)
  365.      &OUTSIZE=&OUTSIZE+&CHUNK
  366. -RCHUNK  &WSIZE = &WSIZE-&CHUNK
  367.  
  368.      return
  369.