home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / ZSYS / ZNODE-12 / I / NZ-TOOL4.LBR / CPY.AZT / CPY.ART
Text File  |  2000-06-30  |  5KB  |  99 lines

  1.  
  2.                         Chasing Your (Command) Tail
  3.  
  4.      [Note: This article is for the person who knows something about Turbo 
  5. Pascal and also Z-System. Alpha Systems Corporation sells both and may be 
  6. reached at (408) 297-5594. End of Note.]
  7.  
  8.      Before getting underway, the following library file which contains all 
  9. the files discussed below (plus some not discussed) is available on the Z- 
  10. Node network:
  11.  
  12.                 Library directory for B0:NZ-TOOL4.LBR  28k
  13. BOX     .PZS   6r : CPY     .AZT  22r : CPY     .CZM  81r : CPY     .PZS  20r
  14. NZ-TOOL .BZX  40r : NZ-TOOL .FOR   4r : PARAMSTR.PZS   9r : PD      .PZS   7r
  15. RAD     .PZS  10r
  16.  
  17.      The demonstration program cpy.pas (The Computer Journal #45), a Z- 
  18. System utility written in Turbo Pascal, did something strange the other 
  19. day!
  20.  
  21.      A little background first. I own Turbo Pascal Version 2 which does not 
  22. have a builtin function to return command line parameters. Version 3 does 
  23. and it's called ParamStr(i:Integer):str80. This function returns the ith 
  24. parameter of a command. Also, Version 2's BlockRead and BlockWrite 
  25. functions are a bit different than Version 3's. I wrote ParamStr, retrofit 
  26. the Block I/O code and finally got a clean compile. Cpy worked as 
  27. advertised. Until I tried ...
  28.  
  29.      C0>cpy develop:ebc.asc floppy:flier.new <ret>
  30.  
  31.      This was supposed to put a copy of the file ebc.asc onto my floppy and 
  32. call it flier.new. It made the copy alright but when a directory was done 
  33. on the floppy a file called flier.ne (no 'w') was found.
  34.  
  35.      On a hunch I decided to rewrite my ParamStr function to use the 
  36. multiple command line buffer instead of the transient buffer. A call to Joe 
  37. Wright confirmed that Turbo Pascal uses the bytes starting at 32 past the 
  38. beginning of the transient buffer for its own purposes. This all worked 
  39. real well until I tried using cpy under the influence of a shell. It also 
  40. did some pretty strange things when it was the second command in a multiple 
  41. command line.
  42.  
  43.                   ............................
  44.                  /                            \
  45.                [ . | . |blah;blah;cpy this that;blah . . .]
  46.  
  47.  
  48.      I had been assuming I could find the cpy command alone and at the 
  49. beginning of the multiple command line buffer. The multiple command line 
  50. buffer (pictured above) starts with a pointer to the next command. To 
  51. locate the cpy command and its tail you must use this pointer and work 
  52. backward til you reach the preceding semicolon, or the beginning of the 
  53. command line.
  54.  
  55.      See the ParamStr function below for the details. The file nz-tool4.lbr 
  56. on Z-Node #12 203 665-1100 contains cpy source and executable as well as 
  57. the file nz-tool.box which must be included to gain Z-System environment 
  58. access.
  59.  
  60.      A final note: Don't do what I did a couple of times ... forget to 
  61. invoke the Turbo Pascal compiler as an *alias* which pokes the z3env header 
  62. into memory after loading the compiler. Cpy.com does some *real* strange 
  63. things if it's compiled under plain turbo.com!
  64.  
  65. Function ParamStr(i:integer):str80;
  66. {
  67. Returns ith string of command. If i=0, returns command itself. If i=1 you 
  68. get the first command tail parameter, etc. This uses the multiple command 
  69. line, *not* the tbuff (hex 80 to hex ff.) Turbo Pascal itself uses tbuff+32 
  70. to tbuff+79 for its own purposes! Needed to write this function because it 
  71. is *not* in the standard lib of Turbo Pascal Version 2.
  72. }
  73. Var
  74.   j,j1,lcmd,lc,p      : Integer;
  75.   whatsleft           : str80;
  76.   cl                  : mclptr;  { from nz-tool.box }
  77. Begin
  78.   cl:=Ptr(getmcl);  { point to multiple command line, using nz-tool.box }
  79.   { determine end of command and its offset in multiple command line } 
  80.   lc:=cl^.nxtchr-1;j:=lc-Ord(cl)-3;lcmd:=0;
  81.   While (cl^.mcl[j]<>';') And (j<>0) Do Begin { back up to start of command }
  82.     j:=j-1;lcmd:=lcmd+1;End;
  83.   { load work string with it }
  84.   For j1:=j+1 To j+1+lcmd-1 Do
  85.     whatsleft[j1-(j+1)+1]:=cl^.mcl[j1];
  86.   whatsleft[0]:=Chr(lcmd);
  87.   p:=Pos(' ',whatsleft);                   { locate first space }
  88.   If (i>0) And (p=0) Then whatsleft:='';
  89.   While (i<>0) And (p<>0) Do Begin         { grab the ith parm }
  90.     i:=i-1;                                { decrement parm counter }
  91.     Delete(whatsleft,1,p);                 { lop off the leading parm }
  92.     p:=Pos(' ',whatsleft);                 { locate next space }
  93.   End;
  94.   If p=0 Then                              { if at end, use what's left }
  95.     ParamStr:=whatsleft
  96.   Else
  97.     ParamStr:=Copy(whatsleft,1,p-1);       { else, what's at the beginning }
  98. End;                                       { of what's left }
  99.