home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 5 / FreshFish_July-August1994.bin / bbs / comm / bbbbs-7.2.lha / BBBBS / BBBBS72.lha / rexx / bbsFile.rexx < prev    next >
OS/2 REXX Batch file  |  1994-04-16  |  27KB  |  1,128 lines

  1. /* $VER: bbsFile.rexx 7.2 (16.4.94) Copyright © 1994 Richard Lee Stockton
  2.  * BBBBS local file uploader
  3.  * FREELY DISTRIBUTABLE
  4. */
  5.  
  6. kill_original=0  /* To "move" files, set this to 1 */
  7.  
  8. IF ~SHOW('P','QuickSortPort') THEN CALL setup.rexx()
  9. IF ~SHOW('P','QuickSortPort') THEN EXIT 666
  10.  
  11. CALL OPENPORT('BBSFILE')
  12.  
  13. title.=''
  14. title.1='BBBBS File Uploader'
  15. title.2='Version 7.1'
  16. title.3='7-Mar-94'
  17.  
  18. def=''
  19. pen2=''
  20. pen3=''
  21. lineup='1B'x'M'
  22. newlist.=''
  23. newlist.0=0
  24. linesperpage=20
  25. namemask=COMPRESS(XRANGE(),XRANGE('A','Z')' _-')
  26.  
  27. topath='RAM:'
  28. figarg='s:CONFIG.BBS'
  29. IF ~EXISTS(figarg) THEN figarg='BBS:BBS_TEXT/CONFIG.BBS'
  30. x=OPEN(f,figarg,'R')
  31. IF x=0 THEN
  32.   DO
  33.     SAY 's:CONFIG.BBS and BBS:BBS/CONFIG.BBS are both missing!'
  34.     EXIT
  35.   END
  36. lynes.=''
  37. DO i=1 TO 40
  38.   lynes.i=READLN(f)
  39. END
  40. CALL CLOSE(f)
  41.  
  42. compos=POS('/*',lynes.1)
  43. IF compos>0 THEN lynes.1=LEFT(lynes.1,compos-1)
  44. bbsname=STRIP(lynes.1)
  45. sysop=WORD(lynes.2,1)
  46. compos=POS('/*',lynes.3)
  47. IF compos>0 THEN lynes.3=LEFT(lynes.3,compos-1)
  48. bbsdevice=word(lynes.4,1)
  49. sysoplevel=WORD(lynes.5,1)
  50. bbspath=WORD(lynes.6,1)
  51. IF ~EXISTS(bbspath) THEN
  52.   DO
  53.     SAY bbspath 'does not exist!'
  54.     EXIT
  55.   END
  56. testchar=RIGHT(bbspath,1)
  57. IF testchar~='/' & testchar~=':' THEN bbspath=bbspath'/'
  58. libpath=WORD(lynes.8,1)
  59. IF ~EXISTS(libpath) THEN
  60.   DO
  61.     SAY libpath 'does not exist!'
  62.     EXIT
  63.   END
  64. testchar=RIGHT(libpath,1)
  65. IF testchar~='/' & testchar~=':' THEN libpath=libpath'/'
  66. IF WORD(lynes.25,1)=1 THEN scratch=bbspath'Scratch'
  67. ELSE scratch='RAM:Scratch'
  68. CALL MAKEDIR(scratch)
  69. extension=WORD(lynes.32,1)
  70. compos=POS('/*',lynes.33)
  71. IF compos>0 THEN lynes.33=LEFT(lynes.33,compos-1)
  72. arccom=STRIP(lynes.33)
  73. IF LEFT(extension,1)~='.' THEN
  74.   DO
  75.     extension='.lzh'
  76.     arccom='lharc -m m'
  77.   END
  78.  
  79. OPTIONS PROMPT ' Are you 'sysop'? (Yn) > '
  80. PULL answer
  81. IF answer='N' THEN
  82.   DO
  83.     SAY
  84.     OPTIONS PROMPT ' Please enter your name > '
  85.     PULL name
  86.     name=cleanstring('1:'name)
  87.     IF name='' THEN EXIT 
  88.     IF ~EXISTS(bbspath'Users/'name) THEN
  89.       DO
  90.         SAY name 'does not exist!'
  91.         EXIT
  92.       END
  93.   END
  94. ELSE name=sysop
  95. userfile=bbspath'Users/'name
  96. CALL OPEN(f,userfile,'R')
  97. data.=''
  98. DO i=1
  99.   line=READLN(f)
  100.   IF EOF(f) THEN LEAVE i
  101.   data.i=line
  102. END
  103. CALL CLOSE(f)
  104. data.0=i-1
  105. password=data.5
  106. level=data.20
  107.  
  108. passprompt=pen3' Please Enter Password: '
  109. DO tries=1 TO 3
  110.   OPTIONS PROMPT passprompt
  111.   PULL newpassword
  112.   SAY def
  113.   IF(password=newpassword) THEN LEAVE tries; /* correct password */
  114.   IF tries=3 THEN
  115.     DO
  116.       SAY 
  117.       SAY 'Access terminated.'
  118.       SAY '*** Bad password ***' newpassword '***'
  119.       EXIT
  120.     END
  121.   passprompt='Incorrect.  Password: ' /* ask again */
  122. END
  123. SAY
  124. SAY' OK, 'name' here we go....'
  125. SAY
  126. dirs.=''
  127. IF readopen(bbspath'Lists/Libraries') THEN
  128.   DO
  129.     SAY 'Loading library list...'
  130.     DO i=1
  131.       line=READLN(f)
  132.       IF line='END' | EOF(f) THEN LEAVE i
  133.       num=WORD(line,1)
  134.       IF DATATYPE(num,'W') THEN dirs.num=STRIP(WORD(line,2))
  135.     END
  136.     CALL CLOSE(f)
  137.     CALL sortlibraries()
  138.   END
  139. SAY
  140.  
  141. DO FOREVER
  142.   SAY
  143.   DO i=1 TO 3
  144.     SAY CENTER(title.i,24)
  145.   END
  146.   SAY
  147.   IF uload()>1 THEN CALL seeya
  148. END
  149.  
  150.  
  151.  
  152. /* SUBROUTINES */
  153.  
  154. sortlibraries:
  155. SAY 'Sorting Libraries...'
  156. count=0
  157. sdirs.=''
  158. DO i=1 TO level
  159.   IF dirs.i='' THEN ITERATE i
  160.   count=count+1
  161.   sdirs.count=dirs.i i
  162. END
  163. sdirs.0=count
  164. IF count>0 THEN CALL QSort(1,count,sdirs)
  165. count=0
  166. libs.=''
  167. DO i=1 TO sdirs.0
  168.   tempnum=WORD(sdirs.i,2)
  169.   tempdir=WORD(sdirs.i,1)
  170.   IF FIND(data.21,UPPER(tempdir))=0 THEN
  171.     DO
  172.       string=' '
  173.       IF tempnum<10 THEN string=string' '
  174.       string=string || tempnum'. 'LEFT(tempdir,14)
  175.       count=count+1
  176.       libs.count=string
  177.     END
  178. END
  179. libs.0=count%4
  180. IF (count//4)>0 THEN libs.0=libs.0+1
  181. DO i=1 TO libs.0
  182.   DO j=1 TO 3
  183.     k=i+j*libs.0
  184.     IF k<=count THEN libs.i=libs.i||libs.k
  185.   END
  186. END
  187. DROP sdirs.
  188. RETURN
  189.  
  190.  
  191. bbsspace:
  192. ARG tabspace .
  193. ADDRESS COMMAND 'C:info >ram:filinfout' bbsdevice
  194. ok=OPEN(f,'ram:filinfout','R')
  195. IF ok=0 THEN RETURN 20
  196. line=READLN(f)
  197. line=READLN(f)
  198. line=READLN(f)
  199. line=READLN(f)
  200. CALL CLOSE(f)
  201. IF tabspace<14 THEN SAY 
  202. bbsk=WORD(line,4)
  203. IF ~DATATYPE(bbsk,'N') THEN
  204.   DO
  205.     line=bbsdevice 'is not an info compatible device!'
  206.     SAY pen3||line||def
  207.     bbsk=0
  208.     RETURN
  209.   END
  210. bbsk=bbsk*512
  211. IF bbsk<1 THEN bbsk=0
  212. SAY RIGHT(comma(bbsk),tabspace) 'bytes available for uploads.'
  213. RETURN
  214.  
  215.  
  216. comma:
  217. ARG num .
  218. dgt=LENGTH(num)
  219. numtext=''
  220. IF dgt>3 THEN numtext=','RIGHT(num,3)
  221. IF dgt>6 THEN numtext=','LEFT(RIGHT(num,6),3)||numtext
  222. IF dgt>9 THEN numtext=','LEFT(RIGHT(num,9),3)||numtext
  223. IF dgt>12 THEN
  224.   DO
  225.     numtext=','LEFT(RIGHT(num,12),3)||numtext
  226.     numtext=LEFT(num,dgt-12)||numtext
  227.   END
  228. ELSE IF dgt>9 THEN numtext=LEFT(num,dgt-9)||numtext
  229. ELSE IF dgt>6 THEN numtext=LEFT(num,dgt-6)||numtext
  230. ELSE IF dgt>3 THEN numtext=LEFT(num,dgt-3)||numtext
  231. ELSE numtext=num
  232. RETURN numtext
  233.  
  234.  
  235. is_here:
  236. ARG newname 
  237. SAY 'Checking filelist...'
  238. DO wi=1 TO 99
  239.   IF wi//3=0 THEN CALL WRITECH(STDOUT,'.')
  240.   IF dirs.wi='' THEN ITERATE wi
  241.   IF ~EXISTS(bbspath'FileNotes/'dirs.wi'/'newname) THEN ITERATE wi
  242.   line=pen3'*** File' newname 'already exists here'
  243.   IF wi<=level THEN line=line 'in the' dirs.wi 'library'
  244.   line=line'.'def
  245.   SAY line
  246.   SAY 'Original uploader should ['pen3'K'def']ill the file before uploading the replacement.'
  247.   CALL waiting()
  248.   RETURN 1
  249. END
  250. RETURN 0
  251.  
  252.  
  253. uload:
  254. CALL bbsspace(12)
  255. SAY
  256. IF bbsk<1 THEN
  257.   DO
  258.     SAY pen3'Upload area is full!'def
  259.     RETURN 2
  260.   END
  261. frompath=GETCLIP('BBS_frompath')
  262. IF frompath='' THEN frompath='RAM:'
  263. fdir=''
  264. DO loop=1
  265.   fromfile=GetFile(200,,frompath,'',' Select File to Upload ')
  266.   IF fromfile='' THEN RETURN 3
  267.   finfo=STATEF(fromfile)
  268.   IF WORD(finfo,1)='DIR' THEN RETURN 3
  269.   IF WORD(finfo,1)='FILE' THEN LEAVE loop
  270.   SAY
  271.   SAY fromfile 'does not exist!'
  272.   CALL DELAY(100)
  273. END
  274. x=LASTPOS('/',fromfile)
  275. IF x=0 THEN x=POS(':',fromfile)
  276. IF x>0 THEN
  277.   DO
  278.     arg=SUBSTR(fromfile,x+1)
  279.     fdir=LEFT(fromfile,x)
  280.     IF RIGHT(fdir,1)='/' THEN fdir=LEFT(fdir,x-1)
  281.     CALL SETCLIP('BBS_frompath',fdir)
  282.   END
  283. ELSE arg=fromfile
  284. arg=COMPRESS(arg,' :/,;|#?*()+[]"{}')  /* be sure no illegals here */
  285. x=LASTPOS('/',fromfile)
  286. IF x=0 THEN x=LASTPOS(':',fromfile)
  287. IF x>0 THEN
  288.   DO
  289.     IF DATATYPE(SUBSTR(fromfile,x+1),'W') THEN
  290.       DO
  291.         SAY 'Whole numbers are not allowed as filenames!'
  292.         CALL waiting()
  293.         RETURN 1
  294.       END
  295.   END
  296. size=WORD(STATEF(fromfile),2)
  297. IF ~DATATYPE(size,'W') THEN size='654321'
  298. tempnum=LENGTH(arg)+LENGTH(size)-22
  299. DO WHILE tempnum>0
  300.   temp='          'pen3||arg def'is'pen3 tempnum||def
  301.   IF tempnum=1 THEN temp=temp 'character'
  302.   ELSE temp=temp 'characters'
  303.   temp=temp 'too long for a filename.'
  304.   SAY temp  
  305.   arg=getinput(0 0 'Filename: ')
  306.   arg=cleanstring('0:'arg)
  307.   arg=COMPRESS(arg,' :/,;|#?*')
  308.   tempnum=LENGTH(arg)+LENGTH(size)-22
  309. END
  310. IF arg='' THEN RETURN 1
  311. IF is_here(arg) THEN RETURN 1
  312. IF bbsprefs.6=1 & sysoplevel>level THEN CALL setdir(libpath'Sysops')
  313. ELSE
  314.   DO
  315.     SAY
  316.     SAY 'Please select an appropriate library for -' pen3||arg def'-'
  317.     IF chdir()>0 THEN RETURN 1
  318.   END
  319. ADDRESS COMMAND 'C:COPY' fromfile PRAGMA('D')'/'arg
  320. IF TestArc.rexx(PRAGMA('D')'/'arg)>0 THEN
  321.   DO
  322.     SAY
  323.     SAY pen3'***'def arg pen3'failed archive check!'def
  324.     SAY
  325.     temp=getinput(1 1 'Do you believe the archive checker made a mistake? (Ny) > ')
  326.     IF temp~='Y' THEN
  327.       DO
  328.         CALL DELETE(arg)
  329.         SAY
  330.         RETURN 1
  331.       END
  332.   END
  333. IF kill_original THEN
  334.   DO
  335.     CALL DELETE(fromfile)
  336.     SAY 'Killed' fromfile'...'
  337.   END
  338. DO ui=sysoplevel+2 TO 100
  339.   IF UPPER(dirs.ui)=UPPER(plaindir) THEN RETURN 0
  340. END
  341. DO WHILE editnote(bbspath'FileNotes/'plaindir'/'arg) /* INSIST on a filenote */
  342. END
  343. RETURN 0
  344.  
  345.  
  346. editnote:
  347. IF arg='' THEN
  348.   DO
  349.     PARSE PULL arg .
  350.     IF arg='' THEN RETURN 0
  351.   END
  352. comment=''
  353. IF ~EXISTS(arg) THEN
  354.   DO
  355.     finfo=STATEF(bbspath'FileNotes/'plaindir'/'arg)
  356.     fromarg=arg
  357.     fromdir=GETCLIP('BBS_frompath')
  358.     IF WORDS(finfo)>7 THEN
  359.       DO
  360.         temp='Y'
  361.         fromdir=WORD(finfo,8)
  362.         fromdir=lastslash(fromdir)
  363.         fromarg=WORD(fromdir,1)
  364.         fromdir=WORD(fromdir,2)
  365.       END
  366.     ELSE
  367.       DO
  368.         IF level<sysoplevel THEN RETURN 0
  369.         temp=getinput(1 1 'Is this file on an another device? (Nqy)')
  370.       END
  371.     IF fromdir='' THEN fromdir='RAM:'
  372.     IF te