Enhancing the Dr. Dobb's C Screen Editor



                               Alan D. Howard
                               Rt. 3, Box 680
                              Crozet, VA 22932

                                July 24, 1982




           At the beginning of Edward K. Ream's article introducing his
      Small-C Screen Editor in Dr. Dobbs Journal (#63, January, 1982)
      he asked whether our present editor lacked flexibility,
      transporability, and extensibility.  Although my mainstay editor
      has been PIE from Software Toolworks, I have often been annoyed
      at its inability to edit large files or to make major structural
      changes in text.  On the other hand, Ream's editor as presented
      did not go much beyond PIE and seemed clumsy in its Edit-mode,
      but it does encourage adapting it to fit individual needs since
      it is presented in source code.  Thus, after several nights of
      typing and several more nights of debugging, I had the C editor
      up and running.
      I have been modifying the editor during the last few months and
      it has evolved to the point that I feel some of Dr. Dobb's
      readers may be interested.  The changes are of several types:
           1)  Extensions to the file-handling and buffer management to
      permit editing large files, extracting parts of the text to a
      different file, and moving and copying portions of the text
      within the file.
           2)  Changing the edit mode operation to recognize special
      keys on the H19 Terminal or H89 Computer instead of single-letter
      commands.  As a bonus, the editor now assumes eXchange mode for
      any other typed key.
           3)  Addition of a few new commands to the edit-mode and some
      changes in rules of operation.
           4)  Slight modifications to allow modular compilation using
      the Software Toolworks C/80 compiler.
      These enhancements are discussed below.
      A documentation file is included
      which summarizes the expanded features and all
      commands.

             Changes to File Handling and Command-Mode Operation

           Most of the changes to the command-mode are concerned with
      adding flexibility to file handling and major buffer alterations.
      Separate read and write files are now maintained, with load
      <nfilename> specifying the read file name, clearing the
      buffer, reading the file, and closing the read file if it all
      fits in the buffer.  Otherwise as much as fits is read in, and
      the read file remains open.  The open <filename> command
      opens the readfile without clearing the buffer or reading
      anything in.  More from the read file can be added to the buffer
      with either the rest or add <n> commands. Rest reads in
      as much more as possible and gives the option of clearing the
      buffer, but add <n> reads only <n> more lines
      without clearing the buffer.  The write file is specified by name
      <filename> for a new file, or delname <filename>
      for writing over an existing file (This replaces the resave
      command).  Write <n> writes n lines from the buffer to
      the write file, deleting those lines.  To balance the existing
      append <filename> command, an extract <from to>
      command has been added to write the indicated line range to a new
      file (the name is requested after the command is entered) without
      deleting those lines from the buffer.  Finally, to allow
      flexibility, the read and write files can be closed by closeread
      and closewrite.
           Major structural changes in the file can now be made using
      the copy <from to n> and move <from to n>
      commands, which take n lines from <from> and copy them to
      before line <to>.  In addition, move deletes the
      <n> lines at <from>.  For speed, these routines
      open up the new space, and then do the copying or moving.  No
      move or copy is allowed if there is not room in the buffer.  If
      buffer space is tight, or if the move or copy is to a part of the
      file not currently in memory, then use the extract and append
      commands, which use the disk as a buffer.
           The following command-mode commands are unaltered from the
      original:  append, change, clear, delete, dos, find, g, list,
      search, and tabs.

                      Changes to Edit and Insert Modes

           The most important change to the edit mode is the
      replacement of the single-letter commands by escape-character
      sequences generated by the special keys on the H19/H89 keyboard.
      Similar keys, but with different escape sequences, are found on
      many other terminals and computers.  This allows default use of
      the eXchange mode (replacing contents of cursor position with the
      typed keystroke) for normal keys, including the space bar.  Most
      special characters and edit mode commands retain their original
      functions (see the documentation portion of the listing for
      details), but two new commands have been created for the edit
      mode:  the HOME key moves alternately to the top and bottom line
      on the screen, and the ERASE key erases from the current cursor
      position to the end of the line.  More subtle changes have also
      been made.  The RETURN key moves to the beginning of the next
      line in Edit mode, but acts as the insert down key in the Insert
      mode.  Both the DC and DELETE keys delete the character at the
      cursor, but BACKSPACE deletes the character to the left of the
      cursor, the same as the original delete character special key.
      The only commands remaining as control codes are split and join.
      There is some room for expansion:  three keys are currently
      assigned to force command mode, but could be reassigned.  Note
      that the ESC key must be pressed twice to be recognized, because
      it is also issued by the special character codes of the keyboard.
      My choice of key assignments and features has admittedly been
      influenced by the PIE editor.

                           Implementation Details

           I'd like to start out with an unsolicited endorsement of the
      Software Toolworks C/80 Compiler, now in version 2.0 and
      incorporating almost all of the C language.  Its a decendent of
      Small-C and is cheap, fast, and powerful.  Its salient feature in
      the context of the editor is support for modular compilation
      using Microsoft M80 and L80.  Since the editor is broken into 9
      fairly independent modules, changes can be made in one without
      having to recompile everything.  Also, SID can be used for
      debugging using global variable and function names.  The
      disadvantage is that variable and function names must be distinct
      at six characters length.  This has necessitated renaming several
      functions in the editor, as listed in Figure 1.  Also, to
      force the main buffer to be at the end of the program, the short
      program MBUFFER.MAC must be assembled by M80 and be the last
      module linked (after the C/80 CLIBRARY module).
           Most details of the changes are explained in the listing.

                             Concluding Remarks

           This editor is a very useful addition to my stable of
      inexpensive editors, and is particularly suited to editing large
      files, interleaving text from other files, and breaking up a file
      or portions of a file into smaller pieces.  It doesn't do
      everything, and some of the things it does do go excruciatingly
      slowly. In particular, the default eXchange operation in the Edit
      mode is somewhat slower than typing speed for my 2 Mz H89, as are
      the insert and delete line commands.  I suggest those with H89's
      go through the bothersome task of reassembling their BIOS with
      the type-ahead buffer option.  The search, find, and change
      commands would benefit from some assembly language optimization.
           When I move on to my next system, I will feel secure that I
      have its first editor waiting in the wings, and it won't cost me
      twice as much as my previous editor for the same features.  The
      modified editor is in the public domain.


                           Altered Function Names

      Original                New

      search1                 suurch
      outgetx                 outxget
      outgety                 outyget
      outhasdn                outdnhas
      outhasup                outuphas
      pmtmode1                pmt1mode
      pmtfile1                pmt1file
      pmtline1                pmt1line
      pmtcol1                 pmt1col
      sysmovdn                sysdnmov
      sysmovup                sysupmov
      bufdeln                 bufndel
      bufoutln                buflnout
      bufmovup                bufupmov
      bufmovdn                bufdnmov
      buffer                  mbuffer

                                  Figure 1