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 / CPM / ZCPR33 / A-R / EDITND.LBR / EDITND.DZC / EDITND.DOC
Text File  |  2000-06-30  |  22KB  |  514 lines

  1. Program: EDITND   - EDIT the resident Named Directory
  2. Author: Al Hawley, Ladera Z-Node, (213) 670-9465
  3.  
  4. EDITND is copyright by A. E. Hawley January 30, 1987.
  5. It may be freely distributed, but it must not be sold 
  6. either separately or as part of a package without the 
  7. written consent of the author.  The author may be reached 
  8. via electronic mail at the Ladera Z-Node in Los Angeles,
  9. 213-670-9465, or through the Lillipute Z-Node in Chicago 
  10. at 312-649-1730.
  11.  
  12. EDITND is released for beta test through the Z-system 
  13. users group Z-SIG on January 30, 1987 by the author.
  14.  
  15. PROGRAM FUNCTION:
  16.      Edit  the System Named Directory.  Change,  add,  or  delete ì
  17. directory  names and passwords.  The changes are to the  resident ì
  18. Named Directory buffer, and may be aborted (restored to original) ì
  19. if desired.
  20.      Why would you want to mess with the system NDR? Read on...
  21.  
  22.  
  23.      ZCPR3  as originally released included an impressive set  of ì
  24. utilities  (now called ZTOOLS).  These utilities create,  modify, ì
  25. and  make use of the ZCPR3 environment to provide the  user  with ì
  26. facilities  like  those  of many mini- and  main-frame  operating ì
  27. systems.  Named  Directories are used by many of the  tools,  and ì
  28. recognized as arguments by all. The manipulation of the currently ì
  29. resident Named DiRectory is the subject of this documentation and ì
  30. of two programs not in the original set of ZTOOLS.
  31.  
  32.                         HOW WE DO IT NOW
  33.  
  34.      MKDIR and LDR are the original tools provided by R. Conn for ì
  35. maintenance  of  the  Named DiRectory  (NDR).  The  former  is  a ì
  36. specialized  editor which creates or modifies files which contain ì
  37. NDR  information.  The  latter loads such files into  the  system ì
  38. named  directory buffer to provide names and passwords for  those ì
  39. Disk/User areas that the user has chosen to define. When the user ì
  40. wishes to redefine D/U name and password assignments,  he does so ì
  41. by executing LDR to load a new .NDR type file from mass  storage. ì
  42. He  might  wish to do this because the task at hand  has  changed ì
  43. (i.e. from edit-assemble-link to data base management or to modem ì
  44. communications)  or because a new floppy disk has been  installed ì
  45. for which the directory names are not relevant.
  46.  
  47.                      WHAT'S WRONG WITH THAT?
  48.  
  49.      As convenient as this arrangement is,  it does imply a major ì
  50. inconvenience  when the number of possible differently  organized ì
  51. floppy  disks becomes significant:  the user must anticipate each ì
  52. combination of disk-drive assignments and create an NDR file  for ì
  53. each  one.  A little reflection will convince you that the number ì
  54. of  NDR  files required grows geometrically with  the  number  of ì
  55. drives available and the number of (differently organized) floppy ì
  56. disks!  What  is  needed to alleviate this problem is a means  of ì
  57. editing  selected  portions  of  the  system  NDR   buffer.   Two ì
  58. approaches  suggest themselves:  1) replace the NDR entries for a ì
  59. drive  with data from the disk currently installed in that  drive ì
  60. and 2) edit individual entries (for ANY D/U) in the NDR.
  61.  
  62. .pa
  63.  
  64.                           ONE SOLUTION
  65.  
  66.      Wilson  H.  Bent  was  the  first  to  recognize  the  first ì
  67. approach.  He  solved  the problem by providing the LDSK  utility ì
  68. which  capitalizes on the common use of zero length  files  which ì
  69. start with a '-' to identify directories for cataloging purposes. ì
  70. LDSK  selects  those  names from the disk in  the  user-specified ì
  71. drive to update the entries in the NDR for that drive.  The  idea ì
  72. was  carried  a  step further by me in DSKNDR  by  including  the ì
  73. ability  to also select the appropriate entries from an NDR  file ì
  74. on the target disk. DSKNDR also recognizes the size of the system ì
  75. NDR,  removing  the necessity of customizing it for those systems ì
  76. which  require  more than the 14 entries allowed in  the  minimum ì
  77. implementation.  See  the documentation for LDSK and  DSKNDR  for ì
  78. more  details  on each.  (Incidentally,  DSKNDR is a  full  ZCPR3 ì
  79. utility; the original version of LDSK was not.)
  80.  
  81.                  ANOTHER SOLUTION, ANOTHER ZTOOL
  82.  
  83.      The present program represents the second approach. It edits ì
  84. individual entries in the system resident NDR. The editing may be ì
  85. done from the invoking command line or in an interactive terminal ì
  86. session.  WHY WOULD ONE WANT TO DO THAT? For one case, the use of ì
  87. LDSK  or DSKNDR might result in duplicate directory names  (ROOT, ì
  88. for example).   EDITND  can be invoked to change one of the names ì
  89. to  something  unique.  LDSK does not provide  passwords;  DSKNDR ì
  90. retains  passwords if they are present in an NDR files  that  was  ì
  91. used.   In either case,  passwords may need to be added, deleted, ì
  92. or  changed.  In  another  (less general) case,   the Sysop for a ì
  93. Remote   Access  System  can use EDITND  to provide  a  temporary ì
  94. password  for  access to  a directory for a specific  user.   The ì
  95. operation  of a  RAS  is such  that the NDR may be  reloaded  for ì
  96. each user,  replacing such dynamic  assignment.  That's  why they ì
  97. are   temporary.   A   little imaginative reflection will  reveal ì
  98. other usage scenarios.
  99.  
  100.      EDITND   was designed first,   THEN written.   Here are  the  ì
  101. main design goals:
  102.  
  103. 1) Make it a ZCPR3 utility;  use standard invokation & arguments. ì
  104. In particular,  ?,/, and // always invoke HELP; /ooo... specifies ì
  105. options.
  106.  
  107. 2) Usage is restricted (by the Wheel byte) to privileged users.
  108.  
  109. 3)  Invokation  from the command line with NO  undesired  console ì
  110. output. (for secure systems)
  111.  
  112. 4) HELP displays on demand.  Make sure that when the program name ì
  113. changes, the Help screen automatically stays relevant!
  114.  
  115. 5) Error messages displayed only if asked for by the user. (I get ì
  116. offended at programs that 'chatter' at me!)
  117.  
  118. 6)  Structured  and well commented source code.  When changes  or ì
  119. debugging are required, these factors really pay off!
  120.  
  121. 7) I know I'll forget some important function.  Therefore,  write ì
  122. the  code so that it's not necessary to re-write the  program  to ì
  123. incorporate   new   features.   Make  the  command  set   readily ì
  124. extendable.
  125.  
  126.                         THE EDITND  PROGRAM
  127.  
  128.      Edits the System Named Directory.  Changes, adds, or deletes ì
  129. directory  names and passwords.  The changes are to the  resident ì
  130. Named Directory buffer, but may be aborted (restored to original) ì
  131. if desired.
  132.      Multiple commands on the command line or in interactive mode ì
  133. are supported.  Commands on the invoking command line produce  no ì
  134. unsolicited console output,  so this program can execute silently ì
  135. in an alias or RAS environment.  In the interactive mode, command ì
  136. errors  are  explained  only  on  request.  The  HELP  screen  is ì
  137. automatically  maintained;  so  if  you change the  name  of  the ì
  138. program,  the version number, or the command separator character, ì
  139. the HELP information will remain relevant.
  140.  
  141.                        HOW TO INVOKE EDITND 
  142.  
  143.      EDITND <cr>         Enter Interactive Mode, prompt user
  144.  
  145.      EDITND  <cr>        Same, but show current NDR first
  146.  
  147.      EDITND <commands>   Execute the commands, then enters
  148.                          interactive mode. Commands are separated
  149.                          by '\' which is the default command
  150.                          delimiter.
  151.  
  152.    EDITND <commands>\x   The 'x' command means 'exit to the
  153.                          operating system'. The interactive
  154.                          mode is never entered. Useful in an
  155.                          Alias, or when only a few changes are
  156.                          to be made. The '\' is the EDITND 
  157.                          command separator.
  158.  
  159.      If  an  error condition occurs during execution of  commands ì
  160. from the invoking command line,  the error code is placed in  the ì
  161. ZCPR3 program error code byte.  There, it can be tested by IF.COM ì
  162. and appropriate action taken.
  163.  
  164. .CP 15
  165.  
  166.      The   following  command  lines display  the  EDITND    Help  ì
  167. screen  without   entering the  interactive  mode.   (i.e.   they ì
  168. display help and then immediately exit to ZCPR3)
  169.  
  170.      EDITND  ?
  171.      EDITND  /
  172.      EDITND  //
  173.  
  174.      From  interactive  mode,  the  HELP commands  (?,/,//)  work ì
  175. differently in several ways.  First, they do not cause an exit to ì
  176. the  operating  system.  Second,  they are sensitive to an  error ì
  177. condition  and  display the offending command  and  a  diagnostic ì
  178. error  message.   Third,  the  error  code  associated  with  the ì
  179. diagnostic is NOT sent to the ZCPR3 program error byte. 
  180.  
  181.      A  complete  BNF-style  description  of  command  syntax  is ì
  182. included below.  In plainer (but not as precise) English, here is ì
  183. a summary of the commands with some examples:
  184.  
  185. RULES FOR FORMING COMMANDS:
  186.  
  187. You may type either upper or lower case. Mix 'em if you want.
  188.  
  189. '\' is the character which separates commands
  190.  
  191. leading and trailing spaces are ignored, except that at least
  192.   one space must separate command arguments. Comma is NOT a
  193.   substitute for a space in most cases.
  194.  
  195. A comma is permitted in certain cases to imply a default DIR
  196.   preceding the comma, and a null (blank) argument after the
  197.   comma. If you supply a dirname before the comma or a PW after
  198.   the comma then these over-ride the default. See examples below.
  199.  
  200. <cr> means carriage return. As usual, nothing will happen until
  201.   you enter a <cr> at the end of a command line.
  202.  
  203. DU means Disk/User, like a8, B3, etc. (note NO COLON. Use of a
  204.   colon after the DU is entirely optional in EDITND )
  205.  
  206. DIR means a directory name that exists in the NDR. Again, a
  207.   terminating colon is not required but is ok.
  208.  
  209. <dir> means EITHER DU or DIR may be used for this command. A
  210.   colon MAY be used (DU: or DIR:) but is not required.
  211.  
  212. .PA
  213.  
  214.                      THE EDITND  COMMANDS 
  215.  
  216.  
  217. <cr>   Displays  the current NDR buffer contents.  If new entries ì
  218.        have been added,  they will not be in sorted order.  Don't ì
  219.        worry.  They will be when the program exits. If it bothers ì
  220.        you, the 's' command will put them in proper order.
  221.        This is an EMPTY command. A '\<cr>' at the end of a string ì
  222.        of  commands,  or  '\\' within a string of  commands  also ì
  223.        causes the current NDR to be displayed. (Just like PWD)
  224.  
  225. X      eXit  to the operating system after making sure  that  the ì
  226.        NDR  is  in  order.   A  sort  is  done  automatically  if ì
  227.        required  to  put  the entries into the normal order.
  228.  
  229. Q      Quit  to the operating system,   restoring the NDR to  its ì
  230.        original  condition.  Any changes made during the  session ì
  231.        are ignored.
  232.  
  233. R      Reset  the NDR to its original condition.  Any changes are  ì
  234.        lost; you are starting over anew.
  235.  
  236. Z      Zap the NDR. All entries are erased. You can add new ones, ì
  237.        if  you  wish.   The 'R' command gets  everything  (except ì
  238.        changes)  back,  and  the 'Q' command leaves  the  entries ì
  239.        restored.   If  you 'X' at  this point,  there will be  NO ì
  240.        entries in the NDR.
  241.  
  242. S      Sorts  the NDR entries into the order that you're used to.        ì
  243.        You  only need to do this for your  own  convenience.  The        ì
  244.        program  will  automatically  sort  the  NDR  on  exit  if ì
  245.        required.
  246.  
  247. /oo... The  slash  is the leading character for Option  commands, ì
  248.        where  'o' represents options from list on the next  page. ì
  249.        One  of the options is the letter 'O' (also '0',  in  case ì
  250.        your terminal makes them both look the same). If you issue ì
  251.        the  command  '/O<cr>' the same list will be displayed  on ì
  252.        your console.  Multiple options may be given in any order; ì
  253.        they are executed in the sequence in which you list  them. ì
  254.        No  spaces are allowed in the option list,  since a  space ì
  255.        terminates the list.
  256.  
  257.  
  258. .PA
  259.  
  260.  
  261.  
  262.          COMMANDS to CHANGE, ADD, and DELETE NDR ENTRIES
  263.  
  264. <dir>                   deletes the entry
  265. <dir>,                  deletes the password
  266.  
  267. to change an entry, the DU or DIR must already exist in the NDR
  268. (if it shows in the NDR display, you can change it)
  269. <dir>,pw                changes password to PW
  270. <dir> new pw            changes both DIR and password
  271. <dir> new,pw            changes both DIR and password
  272. <dir> new,              changes DIR to 'new' & deletes password
  273. <dir> new               changes DIR to 'new' (NOTE: no comma!)
  274.                         and does not change any password
  275.  
  276. to add a new entry, the new DU must be specified
  277. <newdu> name            adds a new entry, newdu:name, & no password
  278. <newdu> name pw         adds a new entry, newdu:name, password=pw
  279. <newdu> name,pw         comma is ok here instead of a space
  280.  
  281.  
  282.                 OPTION COMMANDS (preceded by "/")
  283.  
  284.        /       Display Help. If error, show error diagnostic
  285.        H       Toggle display of help after error diagnostic
  286.        B       Toggle audible notice of command error
  287.        E       Toggle visual notice of command error
  288.        S<ch>   Change command separator to character <ch>
  289.        O       Display this screen of option selections
  290.        C       Display the list of error codes
  291.  
  292. Option commands start with '/' and end with a carriage return  or ì
  293. command  separator.  Multiple options from the list above may  be ì
  294. included in any order. For example,
  295.  
  296.                             /hbeo<cr>       
  297.  
  298. is  perfectly acceptable.   By default,   EDITND  will sound  the ì
  299. bell  and   display   a message on the console to  serve   notice  ì
  300. when   an  error  has  occurred.   If  you  then  ask  for   help  ì
  301. (?,/,or//)  a diagnostic message will be listed,  followed by the ì
  302. main body  of the  help  screen.  The example command above would ì
  303. turn  off   the bell,   warning message,  and the automatic  help ì
  304. display; then show the  above option list.  When no error exists,  ì
  305. the  help   command  shows the help screen  regardless  of  these ì
  306. options.   Note that  if you   assign  a  new   separator,    the  ì
  307. assignment    takes     place  immediately,    and   your    next  ì
  308. separator  must  be  the  one  you assigned!
  309. .pa
  310.  
  311. *****************************************************************
  312. The  remainder  of  this  documentation describes  EDITND    from  ì
  313. a  programming  viewpoint,   and is not required in order to  use  ì
  314. the  program.  If you want to see how the program works in detail ì
  315. or  if you want to make changes in the  program,   the  following  ì
  316. material  will  supplement  the comments in  the  program  source ì
  317. itself.  I  hope  that   these  notes will  help  understand  the ì
  318. programming  techniques and  data  structures  used  and  thereby  ì
  319. inhibit  the  growth  of members  of  the  insect world.   Please ì
  320. coordinate   any   proposed revisions  with  the original  author ì
  321. and   help   prevent   multiple versions with  the  same  version ì
  322. number!
  323.                     Al Hawley, Ladera Z-Node, LA, CA
  324.                     (213) 670-9465 (modem), 649-3575 (voice)
  325. *****************************************************************
  326.  
  327.  
  328.                BNF TYPE COMMAND SYNTAX DESCRIPTION
  329.  
  330. <Command line> = [ <cmd> [ \ <cmd>...]]<cr>
  331.  
  332. <cmd> = <ltr> | <dcmd> | <ocmd>
  333.  
  334.   <ltr> = q | r | s | w | x | z | ? | / |<ucltr>
  335.  
  336.        <ucltr> = Q | R | S | W | X | Z | <mt>
  337.  
  338.          <mt>  = <carriage return> | <\[<sp>...]\>
  339.  
  340.   <dcmd> = <dir>[:] [, | ,<pw> | <name>,<pw> | <name><sp><pw>]
  341.  
  342.          <dir> = "a directory name of 8 or less characters" | <du>
  343.  
  344.          <du>  = <drive letter, a..p><one or two digits, 0-31>
  345.  
  346.          <pw>  = "8 or less ascii characters except delimiters"
  347.  
  348.         <name> = "8 or less characters (a new directory name)"
  349.  
  350.          <sp>  = a space
  351.  
  352.   <ocmd> = / [ <oc> [<oc>...] ]
  353.  
  354.           <oc> = / | H | B | E | O | C | S<ch>
  355.  
  356.           <ch> = "any printable character EXCEPT <ltr>|<oc>"
  357. .pa
  358.  
  359.                      MAIN ROUTINE ALGORITHM:
  360.  
  361. 1) Set up local stack, save system stack pointer
  362.  
  363. 2) Initialize buffers, validate environment, save a copy of
  364. the system NDR for use during an abort. Abort to operating
  365. system with message if fatal error condition exists.
  366.  
  367. 3) Transfer the command tail into the local command line buffer.
  368.  
  369. 4) Do until (program exit condition)
  370.  
  371.       Do until (command line buffer empty) OR (exit condition)
  372.           Transfer a command into single command buffer
  373.           Parse command with ARGV
  374.           Resolve  command logic using parameters to derive a key ì
  375.             for the CASE call to the execution routine.
  376.           If no error, execute the command via call to CASE
  377.           If error, save error code & command in a history buffer
  378.       End until (command line buffer empty) OR (exit condition)
  379.  
  380.       Issue prompt and get command if no exit condition
  381.  
  382.    End until (program exit condition)
  383.  
  384. 4) Perform any required cleanup operations:
  385.     Sort the system NDR if required
  386.     Restore the system NDR from the saved copy if this is an
  387.         abort and changes have been made.
  388.  
  389. 5) Restore the system stack pointer
  390.  
  391. 6) Return to the operating system
  392.  
  393. END OF ALGORITHM
  394. .pa
  395.  
  396.                    COMMAND PARSE & RESOLUTION
  397.  
  398. ALGORITHM:
  399.         Parse  the  command by counting arguments  and  analysing ì
  400. each argument.  Based on the results,  assign a value to a  'key' ì
  401. which uniquely defines the function to be performed.
  402.         If the first argument defies recognition, record an error ì
  403. and ignore the balance of the command.
  404.         If  the  first argument comprises exactly  one  character ì
  405. execute   the  appropriate  function  and  ignore  any  remaining ì
  406. arguments. If the command character is not defined then record an ì
  407. error and ignore the command.
  408.         If  the first argument is a valid DU or DIR then  analyse ì
  409. the  remaining  arguments and reduce the command to  the  general ì
  410. form:  DU <dirname> <password>.  Substitute this reduced form  in ì
  411. the   NDR if DU already exists there,  else append to the NDR  if ì
  412. there is space available. If neither <dirname> nor <password> are ì
  413. given in the argument list, then any existing entry in the NDR is ì
  414. deleted.  When  a  ',' is present which results in  an  ambiguous ì
  415. interpretation, record an error and ignore the command (cases 4 & ì
  416. 5). 
  417.         If  the  first  argument begins with '/' then  treat  the ì
  418. remainder of the characters in that argument as special commands. ì
  419. If  a  command requires an  argument,  the  argument  immediately ì
  420. follows the command letter. Process each command character in the ì
  421. order given. If no characters follow the '/' then consider this a ì
  422. command  to  display the help screen.  On encountering an  error, ì
  423. record the error and abort processing of the remaining options.
  424. .PA
  425.  
  426.                         COMMAND ANALYSIS
  427.  
  428. arg1,  arg2,  etc,  are  Pointers returned by ARGV to the  first, ì
  429. second, etc. arguments in the command.
  430.  
  431. Group  0:  The first argument is not a defined  du,  dir,  single ì
  432. letter command, or a string starting with '/'.
  433.  
  434. arg1            arg2-arg4       action/comment
  435.  
  436. <unknown>       <don't care>    ignore command, record an error
  437.  
  438. Group 1: empty command, or single-letter command
  439.  
  440. arg1    arg2    arg3    arg4  case - action/comment
  441.  
  442. --      --      --      --      0 - display NDR & passwords
  443. <ltr>   --      --      --      A - perform <ltr> function
  444.  
  445. Group 2: the first arg is a valid du|dir form
  446.  
  447. arg1    arg2    arg3    arg4  case - action/comment
  448.  
  449. <dir>   --      --      --      1 - delete entry from NDR
  450. <dir>   name    --      --      2 - replace name/make new entry
  451. <dir>   name    <pw>    --      3 - new name, new password
  452. <dir>   ','     --      --      4 - delete (blank) password
  453. <dir>   ','     <pw>    --      5 - change password
  454. <dir>   name    ','     --      6 - new name, blank password
  455. <dir>   name    ','     <pw>    7 - new name, new password
  456.  
  457. Group 3: The first arg begins with a '/'
  458.  
  459. arg1            arg2-arg4       action/comment
  460.  
  461. /[<str>]        (ignore)        case  9 - <str> is a sequence  of ì
  462.                                 characters  which define settable ì
  463.                                 options.   '/'   as   an   option ì
  464.                                 character    invokes   the   help ì
  465.                                 screen.
  466.  
  467. .pa
  468.  
  469.           CALCULATION OF CASE-KEY (ckey) FOR EACH CASE
  470.  
  471. a1code = (if single ltr) ascii (else) 0
  472. a2code = (if arg2 = ',') 2 (else) 0
  473. a3code = (if arg3 = ',') 3 (else) 0
  474.  
  475.         argnum  a1code  a2code  a3code  ckey=sum
  476.  
  477. case 0     0       0       0       0       0
  478. case 1     1       0       0       0       1
  479. case 2     2       0       0       0       2
  480. case 3     3       0       0       0       3
  481.  
  482. case 4     2       0       2       0       4
  483. case 5     3       0       2       0       5
  484.  
  485. case 6     3       0       0       3       6
  486. case 7     4       0       0       3       7
  487. case 8  (not defined)
  488. case 9     >0      8       0       0       9 (argnum <- 1)
  489. case A     1    ascii-1    0       0     ascii
  490.  
  491.  
  492.                 PROCESSING REQUIRED FOR EACH CASE
  493.  
  494. notes:  1) appflg = FALSE if d/u IS in the NDR, else TRUE
  495.         2) xx -> yy means "make xx point to yy"
  496.         3) xx <= yy means "make xx equal to yy"
  497.  
  498.         if appflg=F:                    if appflg=T:
  499.  
  500. case 0  display ndr                     display ndr
  501. case 1  delete entry                    do nothing
  502. case 2  arg3->dirpw                     arg3->spaces
  503. case 3  replace NDR entry               append new NDR entry
  504.  
  505. case 4  arg2->dirname, arg3->spaces     do nothing(err)
  506. case 5  arg2->dirname                   do nothing(err)
  507.  
  508. case 6  arg3->spaces                    arg3->spaces
  509. case 7  arg3<=arg4                      arg3<=arg4
  510.  
  511. case 9  argnum <- 1, do option(s) or display help
  512. case A  do ltr cmd                      do ltr cmd
  513.  
  514.