home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume38 / input-edit / patch01 next >
Text File  |  1993-06-20  |  15KB  |  497 lines

  1. Newsgroups: comp.sources.misc
  2. From: thewalt@canuck.CE.Berkeley.EDU (Chris Thewalt)
  3. Subject: v38i004: input-edit - C input functions for line editing with history, Patch01
  4. Message-ID: <1993Jun17.182049.9245@sparky.imd.sterling.com>
  5. X-Md4-Signature: bcdadcdf5c245e8f44979013c69b038f
  6. Sender: kent@sparky.imd.sterling.com (Kent Landfield)
  7. Organization: Sterling Software
  8. Date: Thu, 17 Jun 1993 18:20:49 GMT
  9. Approved: kent@sparky.imd.sterling.com
  10.  
  11. Submitted-by: thewalt@canuck.CE.Berkeley.EDU (Chris Thewalt)
  12. Posting-number: Volume 38, Issue 4
  13. Archive-name: input-edit/patch01
  14. Environment: unix, vms, dos, posix
  15. Patch-To: input-edit: Volume 37, Issue 50
  16.  
  17. Changes since v37i050:
  18.   * Added support for AIX, XENIX, TurboC, gcc (EMX) under OS/2
  19.   * Added ^U (kill line) functionality
  20.   * Added ESC-B/ESC-F backward/forward one word functionality
  21.   * Made it possible to preload history with gl_histadd() before calling
  22.     getline()
  23.   
  24. What is input-edit?
  25.  
  26.   Many interactive programs read input line by line, but would like to
  27.   provide line editing and history functionality to the end-user that
  28.   runs the program.
  29.  
  30.   The input-edit package provides that functionality.  As far as the
  31.   programmer is concerned, the program only asks for the next line
  32.   of input. However, until the user presses the RETURN key they can
  33.   use emacs-style line editing commands and can traverse the history of
  34.   lines previously typed.
  35.  
  36.   Other packages, such as GNU's readline, have greater capability but are
  37.   also substantially larger.  Input-edit is small, since it uses neither
  38.   stdio nor any termcap features, and is also quite portable.  It only
  39.   uses \b to backspace and \007 to ring the bell on errors.  Since it
  40.   cannot edit multiple lines it scrolls long lines left and right on
  41.   the same line.
  42.  
  43.   Input edit uses classic (not ANSI) C, and should run on any Unix
  44.   system (BSD, SYSV or POSIX), PC's under DOS with MSC or TurboC,
  45.   PC's under OS/2 with gcc (EMX), or Vax/VMS.  Porting the package to
  46.   new systems basicaly requires code to read a character when it is
  47.   typed without echoing it, everything else should be OK.
  48. ---------------
  49. #! /bin/sh
  50. # This is a shell archive.  Remove anything before this line, then feed it
  51. # into a shell via "sh file" or similar.  To overwrite existing files,
  52. # type "sh file -c".
  53. # Contents:  v37i50.fix
  54. # Wrapped by kent@sparky on Thu Jun 17 13:18:39 1993
  55. PATH=/bin:/usr/bin:/usr/ucb:/usr/local/bin:/usr/lbin ; export PATH
  56. echo If this archive is complete, you will see the following message:
  57. echo '          "shar: End of archive 1 (of 1)."'
  58. if test -f 'v37i50.fix' -a "${1}" != "-c" ; then 
  59.   echo shar: Will not clobber existing file \"'v37i50.fix'\"
  60. else
  61.   echo shar: Extracting \"'v37i50.fix'\" \(11427 characters\)
  62.   sed "s/^X//" >'v37i50.fix' <<'END_OF_FILE'
  63. Xin the directory containing the input-edit v37i050 source code type:
  64. X   patch -p < v37i50.fix
  65. X
  66. X*** CHANGES.orig    Sat May 15 11:49:16 1993
  67. X--- CHANGES    Sun May 16 19:41:15 1993
  68. X***************
  69. X*** 1,3 ****
  70. X--- 1,10 ----
  71. X+ Changes from last release (v37i050 in comp.sources.misc)
  72. X+ * Added support for AIX, XENIX, TurboC, gcc (EMX) under OS/2
  73. X+ * Added ^U (kill line) functionality
  74. X+ * Added ESC-B/ESC-F backward/forward one word functionality
  75. X+ * Made it possible to preload history with gl_histadd() before calling
  76. X+   getline()
  77. X+ 
  78. X  Changes from last release (v28i056 in comp.sources.misc)
  79. X  
  80. X  * type-ahead saved in BSD mode (was OK in SYSV and POSIX)
  81. X*** README.orig    Sat May 15 11:49:16 1993
  82. X--- README    Tue May 18 09:30:00 1993
  83. X***************
  84. X*** 17,26 ****
  85. X  edit multiple lines it scrolls long lines left and right on the same line.
  86. X  
  87. X  Input edit uses classic (not ANSI) C, and should run on any Unix 
  88. X! system (BSD, SYSV or POSIX), PC's with the MSC compiler, or 
  89. X! Vax/VMS (untested by me).  Porting the package to new systems basicaly 
  90. X! requires code to read a character when it is typed without echoing it, 
  91. X! everything else should be OK.
  92. X  
  93. X  I have run the package on:
  94. X  
  95. X--- 17,26 ----
  96. X  edit multiple lines it scrolls long lines left and right on the same line.
  97. X  
  98. X  Input edit uses classic (not ANSI) C, and should run on any Unix 
  99. X! system (BSD, SYSV or POSIX), PC's under DOS with MSC or TurboC,  PC's under
  100. X! OS/2 with gcc (EMX), or Vax/VMS.  Porting the package to new systems 
  101. X! basicaly requires code to read a character when it is typed without 
  102. X! echoing it, everything else should be OK.
  103. X  
  104. X  I have run the package on:
  105. X  
  106. X***************
  107. X*** 27,33 ****
  108. X      DECstation 5000, Ultrix 4.3 with cc 2.1 and gcc 2.3.3
  109. X      Sun Sparc 2, SunOS 4.1.1, with cc
  110. X      SGI Iris, IRIX System V.3, with cc
  111. X!     PC, DRDOS 5.0, with MSC 6.0
  112. X  
  113. X  The description below is broken into two parts, the end-user (editing) 
  114. X  interface and the programmer interface.  Send bug reports, fixes and 
  115. X--- 27,33 ----
  116. X      DECstation 5000, Ultrix 4.3 with cc 2.1 and gcc 2.3.3
  117. X      Sun Sparc 2, SunOS 4.1.1, with cc
  118. X      SGI Iris, IRIX System V.3, with cc
  119. X!     PC using DOS with MSC
  120. X  
  121. X  The description below is broken into two parts, the end-user (editing) 
  122. X  interface and the programmer interface.  Send bug reports, fixes and 
  123. X***************
  124. X*** 36,41 ****
  125. X--- 36,46 ----
  126. X  Chris Thewalt (thewalt@ce.berkeley.edu)   
  127. X  5/3/93
  128. X  
  129. X+ Thanks to the following people who have provided enhancements and fixes:
  130. X+   Ron Ueberschaer, Christoph Keller, Scott Schwartz, Steven List,
  131. X+   DaviD W. Sanderson, Goran Bostrom, Michael Gleason, Glenn Kasten,
  132. X+   Edin Hodzic, Eric J Bivona, Kai Uwe Rommel
  133. X+ 
  134. X  PS: I don't have, and don't want to add, a vi mode, sorry.
  135. X  
  136. X  ************************** End-User Interface ***************************
  137. X***************
  138. X*** 48,53 ****
  139. X--- 53,60 ----
  140. X  
  141. X  ^A/^E    : Move cursor to beginning/end of the line.
  142. X  ^F/^B   : Move cursor forward/backward one character.
  143. X+ ESC-F    : Move cursor forward one word.
  144. X+ ESC-B   : Move cursor backward one word.
  145. X  ^D    : Delete the character under the cursor.
  146. X  ^H, DEL : Delete the character to the left of the cursor.
  147. X  ^K    : Kill from the cursor to the end of line.
  148. X***************
  149. X*** 69,74 ****
  150. X--- 76,82 ----
  151. X        any other editing character accepts the current match and 
  152. X        loads it into the buffer, terminating the search.
  153. X  ^T    : Toggle the characters under and to the left of the cursor.
  154. X+ ^U      : Deletes the entire line
  155. X  ^Y    : Yank previously killed text back at current location.  Note that
  156. X        this will overwrite or insert, depending on the current mode.
  157. X  TAB    : By default adds spaces to buffer to get to next TAB stop 
  158. X*** getline.3.orig    Sat May 15 11:49:16 1993
  159. X--- getline.3    Sat May 15 12:09:07 1993
  160. X***************
  161. X*** 251,262 ****
  162. X  Move cursor to beginning of line.
  163. X  .Tp "^B"
  164. X  Move cursor left (back) 1 column.
  165. X  .Tp "^D"
  166. X  Delete the character under the cursor.
  167. X  .Tp "^E"
  168. X  Move cursor to end of line.
  169. X  .Tp "^F"
  170. X! Move point right (forward) 1 column.
  171. X  .Tp "^H"
  172. X  Delete the character left of the cursor.@
  173. X  .Tp "^I"
  174. X--- 251,266 ----
  175. X  Move cursor to beginning of line.
  176. X  .Tp "^B"
  177. X  Move cursor left (back) 1 column.
  178. X+ .Tp ESC-B
  179. X+ Move cursor back one word.
  180. X  .Tp "^D"
  181. X  Delete the character under the cursor.
  182. X  .Tp "^E"
  183. X  Move cursor to end of line.
  184. X  .Tp "^F"
  185. X! Move cursor right (forward) 1 column.
  186. X! .Tp ESC-F
  187. X! Move cursor forward one word.
  188. X  .Tp "^H"
  189. X  Delete the character left of the cursor.@
  190. X  .Tp "^I"
  191. X***************
  192. X*** 321,330 ****
  193. X  but in the opposite direction through the history list.
  194. X  .Tp "^T"
  195. X  Transpose current and previous character.
  196. X  .Tp "^Y"
  197. X! Yank previously killed
  198. X! .RB (\| ^K \|)
  199. X! text back at current location.
  200. X  .Tp BACKSPACE
  201. X  Delete the character left of the cursor.
  202. X  .Tp DEL
  203. X--- 325,335 ----
  204. X  but in the opposite direction through the history list.
  205. X  .Tp "^T"
  206. X  Transpose current and previous character.
  207. X+ .Tp "^U"
  208. X+ Kill the entire line (see
  209. X+ .BR "^Y" \|).
  210. X  .Tp "^Y"
  211. X! Yank previously killed text back at current location.
  212. X  .Tp BACKSPACE
  213. X  Delete the character left of the cursor.
  214. X  .Tp DEL
  215. X*** getline.c.orig    Fri May 14 14:37:47 1993
  216. X--- getline.c    Sun May 16 09:42:19 1993
  217. X***************
  218. X*** 1,6 ****
  219. X  #ifndef lint
  220. X  static char     rcsid[] =
  221. X! "$Id: getline.c,v 3.7 1993/05/03 20:57:50 thewalt Exp thewalt $";
  222. X  static char    *copyright = "Copyright (C) 1991, 1992, 1993, Chris Thewalt";
  223. X  #endif
  224. X  
  225. X--- 1,6 ----
  226. X  #ifndef lint
  227. X  static char     rcsid[] =
  228. X! "$Id: getline.c,v 3.8 1993/05/16 16:41:51 thewalt Exp thewalt $";
  229. X  static char    *copyright = "Copyright (C) 1991, 1992, 1993, Chris Thewalt";
  230. X  #endif
  231. X  
  232. X***************
  233. X*** 13,18 ****
  234. X--- 13,23 ----
  235. X   * copyright notice and this permission notice appear in supporting
  236. X   * documentation.  This software is provided "as is" without express or
  237. X   * implied warranty.
  238. X+  *
  239. X+  * Thanks to the following people who have provided enhancements and fixes:
  240. X+  *   Ron Ueberschaer, Christoph Keller, Scott Schwartz, Steven List,
  241. X+  *   DaviD W. Sanderson, Goran Bostrom, Michael Gleason, Glenn Kasten,
  242. X+  *   Edin Hodzic, Eric J Bivona, Kai Uwe Rommel
  243. X   */
  244. X  
  245. X  #include       "getline.h"
  246. X***************
  247. X*** 80,85 ****
  248. X--- 85,91 ----
  249. X  static void     gl_redraw();        /* issue \n and redraw all */
  250. X  static void     gl_transpose();        /* transpose two chars */
  251. X  static void     gl_yank();        /* yank killed text */
  252. X+ static void     gl_word();        /* move a word */
  253. X  
  254. X  static void     hist_init();    /* initializes hist pointers */
  255. X  static char    *hist_next();    /* return ptr to next item */
  256. X***************
  257. X*** 96,101 ****
  258. X--- 102,111 ----
  259. X  extern int      write();
  260. X  extern void     exit();
  261. X  
  262. X+ #ifdef _IBMR2
  263. X+ #define unix
  264. X+ #endif
  265. X+ 
  266. X  #ifdef MSDOS
  267. X  #include <bios.h>
  268. X  #endif
  269. X***************
  270. X*** 109,114 ****
  271. X--- 119,127 ----
  272. X  struct termios  new_termios, old_termios;
  273. X  #else /* not POSIX */
  274. X  #include <sys/ioctl.h>
  275. X+ #ifdef M_XENIX    /* does not really use bsd terminal interface */
  276. X+ #undef TIOCSETN
  277. X+ #endif /* M_XENIX */
  278. X  #ifdef TIOCSETN        /* use BSD interface */
  279. X  #include <sgtty.h>
  280. X  struct sgttyb   new_tty, old_tty;
  281. X***************
  282. X*** 216,221 ****
  283. X--- 229,253 ----
  284. X  #endif 
  285. X  }
  286. X  
  287. X+ #if MSDOS || __EMX__
  288. X+ int pc_keymap(c)
  289. X+ int c;
  290. X+ {
  291. X+     switch (c) {
  292. X+     case 72: c = 16;   /* up -> ^P */
  293. X+         break;
  294. X+     case 80: c = 14;   /* down -> ^N */
  295. X+         break;
  296. X+     case 75: c = 2;    /* left -> ^B */
  297. X+         break;
  298. X+     case 77: c = 6;    /* right -> ^F */
  299. X+         break;
  300. X+     default: c = 0;    /* make it garbage */
  301. X+     }
  302. X+     return c;
  303. X+ }
  304. X+ #endif /* MSDOS || __EMCX__ */
  305. X+ 
  306. X  static int
  307. X  gl_getc()
  308. X  /* get a character without echoing it to screen */
  309. X***************
  310. X*** 229,247 ****
  311. X  #ifdef MSDOS
  312. X      c = _bios_keybrd(_NKEYBRD_READ);
  313. X      if ((c & 0377) == 224) {
  314. X!     switch (c = (c >> 8) & 0377) {
  315. X!       case 72: c = 16;   /* up -> ^P */
  316. X!         break;
  317. X!           case 80: c = 14;   /* down -> ^N */
  318. X!         break;
  319. X!       case 75: c = 2;    /* left -> ^B */
  320. X!         break;
  321. X!           case 77: c = 6;    /* right -> ^F */
  322. X!         break;
  323. X!       default: c = 0;    /* make it garbage */
  324. X!     }
  325. X      } else {
  326. X!     c = c & 0377;
  327. X      }
  328. X  #endif
  329. X  #ifdef vms
  330. X--- 261,283 ----
  331. X  #ifdef MSDOS
  332. X      c = _bios_keybrd(_NKEYBRD_READ);
  333. X      if ((c & 0377) == 224) {
  334. X!     c = pc_keymap((c >> 8) & 0377);
  335. X!     } else {
  336. X!     c &= 0377;
  337. X!     }
  338. X! #endif
  339. X! #ifdef __TURBOC__
  340. X!     while(!bioskey(1))
  341. X!     ;
  342. X!     c = bioskey(0) & 0xff;
  343. X! #endif
  344. X! #ifdef __EMX__
  345. X! #define getch() _read_kbd(0, 1, 0)
  346. X!     c = getch();
  347. X!     if (c == 224 || c == 0) {
  348. X!         c = pc_keymap(getch());
  349. X      } else {
  350. X!         c &= 0377;
  351. X      }
  352. X  #endif
  353. X  #ifdef vms
  354. X***************
  355. X*** 393,399 ****
  356. X                      gl_fixup(gl_prompt, loc, tmp);
  357. X                  }
  358. X          break;
  359. X!           case '\013': gl_kill();                /* ^K */
  360. X          break;
  361. X            case '\014': gl_redraw();                /* ^L */
  362. X          break;
  363. X--- 429,435 ----
  364. X                      gl_fixup(gl_prompt, loc, tmp);
  365. X                  }
  366. X          break;
  367. X!           case '\013': gl_kill(gl_pos);            /* ^K */
  368. X          break;
  369. X            case '\014': gl_redraw();                /* ^L */
  370. X          break;
  371. X***************
  372. X*** 417,422 ****
  373. X--- 453,460 ----
  374. X          break;
  375. X            case '\024': gl_transpose();            /* ^T */
  376. X          break;
  377. X+               case '\025': gl_kill(0);                /* ^U */
  378. X+         break;
  379. X            case '\031': gl_yank();                /* ^Y */
  380. X          break;
  381. X            case '\033':                /* ansi arrow keys */
  382. X***************
  383. X*** 442,447 ****
  384. X--- 480,489 ----
  385. X                default: gl_putc('\007');         /* who knows */
  386. X                  break;
  387. X              }
  388. X+         } else if (c == 'f' || c == 'F') {
  389. X+             gl_word(1);
  390. X+         } else if (c == 'b' || c == 'B') {
  391. X+             gl_word(-1);
  392. X          } else
  393. X              gl_putc('\007');
  394. X          break;
  395. X***************
  396. X*** 594,611 ****
  397. X  }
  398. X  
  399. X  static void
  400. X! gl_kill()
  401. X! /* delete from current position to the end of line */
  402. X! {
  403. X!     if (gl_pos < gl_cnt) {
  404. X!     strcpy(gl_killbuf, gl_buf + gl_pos);
  405. X!     gl_buf[gl_pos] = '\0';
  406. X!     gl_fixup(gl_prompt, gl_pos, gl_pos);
  407. X      } else
  408. X      gl_putc('\007');
  409. X  }
  410. X  
  411. X  static void
  412. X  gl_redraw()
  413. X  /* emit a newline, reset and redraw prompt and current input line */
  414. X  {
  415. X--- 636,679 ----
  416. X  }
  417. X  
  418. X  static void
  419. X! gl_kill(pos)
  420. X! int pos;
  421. X! /* delete from pos to the end of line */
  422. X! {
  423. X!     if (pos < gl_cnt) {
  424. X!     strcpy(gl_killbuf, gl_buf + pos);
  425. X!     gl_buf[pos] = '\0';
  426. X!     gl_fixup(gl_prompt, pos, pos);
  427. X      } else
  428. X      gl_putc('\007');
  429. X  }
  430. X  
  431. X  static void
  432. X+ gl_word(direction)
  433. X+ int direction;
  434. X+ /* move forward or backword one word */
  435. X+ {
  436. X+     int pos = gl_pos;
  437. X+ 
  438. X+     if (direction > 0) {        /* forward */
  439. X+         while (!isspace(gl_buf[pos]) && pos < gl_cnt) 
  440. X+         pos++;
  441. X+     while (isspace(gl_buf[pos]) && pos < gl_cnt)
  442. X+         pos++;
  443. X+     } else {                /* backword */
  444. X+     if (pos > 0)
  445. X+         pos--;
  446. X+     while (isspace(gl_buf[pos]) && pos > 0)
  447. X+         pos--;
  448. X+         while (!isspace(gl_buf[pos]) && pos > 0) 
  449. X+         pos--;
  450. X+     if (pos < gl_cnt && isspace(gl_buf[pos]))   /* move onto word */
  451. X+         pos++;
  452. X+     }
  453. X+     gl_fixup(gl_prompt, -1, pos);
  454. X+ }
  455. X+ 
  456. X+ static void
  457. X  gl_redraw()
  458. X  /* emit a newline, reset and redraw prompt and current input line */
  459. X  {
  460. X***************
  461. X*** 795,800 ****
  462. X--- 863,873 ----
  463. X      char *p = buf;
  464. X      int len;
  465. X  
  466. X+     /* in case we call gl_histadd() before we call getline() */
  467. X+     if (gl_init_done < 0) {        /* -1 only on startup */
  468. X+         hist_init();
  469. X+         gl_init_done = 0;
  470. X+     }
  471. X      while (*p == ' ' || *p == '\t' || *p == '\n') 
  472. X      p++;
  473. X      if (*p) {
  474. END_OF_FILE
  475.   if test 11427 -ne `wc -c <'v37i50.fix'`; then
  476.     echo shar: \"'v37i50.fix'\" unpacked with wrong size!
  477.   fi
  478.   # end of 'v37i50.fix'
  479. fi
  480. echo shar: End of archive 1 \(of 1\).
  481. cp /dev/null ark1isdone
  482. MISSING=""
  483. for I in 1 ; do
  484.     if test ! -f ark${I}isdone ; then
  485.     MISSING="${MISSING} ${I}"
  486.     fi
  487. done
  488. if test "${MISSING}" = "" ; then
  489.     echo You have the archive.
  490.     rm -f ark[1-9]isdone
  491. else
  492.     echo You still must unpack the following archives:
  493.     echo "        " ${MISSING}
  494. fi
  495. exit 0
  496. exit 0 # Just in case...
  497.