home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume16 / ms_sh-1.6 / patch02 < prev    next >
Internet Message Format  |  1991-01-19  |  27KB

  1. From: istewart@datlog.co.uk (Ian Stewartson)
  2. Newsgroups: comp.sources.misc
  3. Subject: v16i079:  MSDOS Shell (sh) Implementation 1.6.4, Patch02/02
  4. Message-ID: <1991Jan16.195307.11545@sparky.IMD.Sterling.COM>
  5. Date: 16 Jan 91 19:53:07 GMT
  6. Approved: kent@sparky.imd.sterling.com
  7. X-Checksum-Snefru: f39d290a 126a326c 64f70703 d46e6659
  8.  
  9. Submitted-by: istewart@datlog.co.uk (Ian Stewartson)
  10. Posting-number: Volume 16, Issue 79
  11. Archive-name: ms_sh-1.6/patch02
  12. Patch-To: ms_sh-1.6: Volume 12, Issue 19-26
  13.  
  14. # this is SH.02 (part 2 of a multipart archive)
  15. # do not concatenate these parts, unpack them in order with /bin/sh
  16. # file Patch1.6.4 continued
  17. #
  18. if test ! -r _shar_seq_.tmp; then
  19.     echo 'Please unpack part 1 first!'
  20.     exit 1
  21. fi
  22. (read Scheck
  23.  if test "$Scheck" != 2; then
  24.     echo Please unpack part "$Scheck" next!
  25.     exit 1
  26.  else
  27.     exit 0
  28.  fi
  29. ) < _shar_seq_.tmp || exit 1
  30. if test ! -f _shar_wnt_.tmp; then
  31.     echo 'x - still skipping Patch1.6.4'
  32. else
  33. echo 'x - continuing file Patch1.6.4'
  34. sed 's/^X//' << 'SHAR_EOF' >> 'Patch1.6.4' &&
  35. X      {
  36. !     if ((cp = evalstr (*(wp++), DOSUB)) && gmatch (w, cp, FALSE))
  37. X          return &t1->left;
  38. X      }
  39. X  
  40. --- 861,868 ----
  41. X  
  42. X      for (wp = t1->words; *wp != (char *)NULL;)
  43. X      {
  44. !     if ((cp = evalstr (*(wp++), DOSUB)) &&
  45. !         gmatch (w, cp, FALSE, (char **)NULL, GM_ALL))
  46. X          return &t1->left;
  47. X      }
  48. X  
  49. ***************
  50. *** 922,928 ****
  51. X          {
  52. X  
  53. X  /* No entry for the file - if the file exists, execute it as a shell
  54. !  * script
  55. X   */
  56. X          case ENOENT:
  57. X              if ((res = O_for_execute (p_name, ¶ms, &nargc)) >= 0)
  58. --- 949,955 ----
  59. X          {
  60. X  
  61. X  /* No entry for the file - if the file exists, execute it as a shell
  62. !  * script.  If we never find the file, return the error
  63. X   */
  64. X          case ENOENT:
  65. X              if ((res = O_for_execute (p_name, ¶ms, &nargc)) >= 0)
  66. ***************
  67. *** 933,939 ****
  68. X  
  69. X              else if (!Check_for_bat_file (p_name))
  70. X              {
  71. !             em = "not found";
  72. X              eloop = FALSE;
  73. X              break;
  74. X              }
  75. --- 960,966 ----
  76. X  
  77. X              else if (!Check_for_bat_file (p_name))
  78. X              {
  79. !             errno = ENOENT;
  80. X              eloop = FALSE;
  81. X              break;
  82. X              }
  83. ***************
  84. *** 953,958 ****
  85. --- 980,986 ----
  86. X                    == (char **)NULL)
  87. X              {
  88. X              em = strerror (ENOMEM);
  89. +             errno = ENOMEM;
  90. X              break;
  91. X              }
  92. X  
  93. ***************
  94. *** 1017,1022 ****
  95. --- 1045,1051 ----
  96. X  
  97. X              em = "no Shell";
  98. X              eloop = FALSE;
  99. +             errno = ENOEXEC;
  100. X              break;
  101. X  
  102. X          case ENOEXEC:
  103. ***************
  104. *** 1039,1048 ****
  105. X      } while ((sp != (char *)NULL) && !eloop);
  106. X      }
  107. X  
  108. !     print_warn ("%s: %s\n", c, em);
  109. X  
  110. !     if (!d_flag)
  111. !     exit (-1);
  112. X  
  113. X      return -1;
  114. X  }
  115. --- 1068,1082 ----
  116. X      } while ((sp != (char *)NULL) && !eloop);
  117. X      }
  118. X  
  119. ! /* If we found the program - report the error */
  120. X  
  121. !     if (errno != ENOENT)
  122. !     {
  123. !     print_warn (EF_msg, c, em);
  124. !     if (!d_flag)
  125. !         exit (-1);
  126. !     }
  127. X  
  128. X      return -1;
  129. X  }
  130. Index: shell/sh4.c
  131. Prereq: 1.9
  132. *** ../sh16.3/shell/sh4.c    Fri Aug 17 21:34:51 1990
  133. --- shell/sh4.c    Tue Nov  6 19:22:00 1990
  134. ***************
  135. *** 13,21 ****
  136. X   * 2.  The sources (or parts thereof) or objects generated from the sources
  137. X   *     (or parts of sources) cannot be sold under any circumstances.
  138. X   *
  139. !  *    $Header: C:/SRC/SHELL/RCS/sh4.c 1.9 90/08/16 10:29:27 Ian_Stewartson Exp $
  140. X   *
  141. X   *    $Log:    sh4.c $
  142. X   * Revision 1.9  90/08/16  10:29:27  Ian_Stewartson
  143. X   * Add support from String length option in ${}.
  144. X   * Restore the memcpys
  145. --- 13,27 ----
  146. X   * 2.  The sources (or parts thereof) or objects generated from the sources
  147. X   *     (or parts of sources) cannot be sold under any circumstances.
  148. X   *
  149. !  *    $Header: C:/SRC/SHELL/RCS/sh4.c 1.11 90/09/11 20:01:23 Ian_Stewartson Exp $
  150. X   *
  151. X   *    $Log:    sh4.c $
  152. +  * Revision 1.11  90/09/11  20:01:23  Ian_Stewartson
  153. +  * Fix ${#*} functionality to match POSIX
  154. +  * 
  155. +  * Revision 1.10  90/08/24  21:56:18  Ian_Stewartson
  156. +  * Add support for POSIX macro commands {x#y} and {x%y}
  157. +  * 
  158. X   * Revision 1.9  90/08/16  10:29:27  Ian_Stewartson
  159. X   * Add support from String length option in ${}.
  160. X   * Restore the memcpys
  161. ***************
  162. *** 505,511 ****
  163. X  
  164. X      *e.linep = 0;
  165. X  
  166. ! /* Scan for =-+? in string */
  167. X  
  168. X      if (*s)
  169. X      {
  170. --- 511,517 ----
  171. X  
  172. X      *e.linep = 0;
  173. X  
  174. ! /* Scan for =-+?%# in string */
  175. X  
  176. X      if (*s)
  177. X      {
  178. ***************
  179. *** 514,526 ****
  180. X  
  181. X  /* Check for end character other than null (=-+?) */
  182. X  
  183. !         if (any (*cp, "=-+?"))
  184. X          {
  185. X          c = *cp;
  186. X  
  187. ! /* Check for case of :[=-+?].  If found - set flag */
  188. !         if (*(cp - 1) == ':')
  189. X          {
  190. X              colon_f = TRUE;
  191. X              *(cp - 1) = 0;
  192. --- 520,533 ----
  193. X  
  194. X  /* Check for end character other than null (=-+?) */
  195. X  
  196. !         if (any (*cp, "=-+?%#"))
  197. X          {
  198. X          c = *cp;
  199. X  
  200. ! /* Skip next section in case of % or #.  Check for case of :[=-+?]. 
  201. !  * If found - set flag
  202. !  */
  203. !         if ((c != '%') && (c != '#') && (*(cp - 1) == ':'))
  204. X          {
  205. X              colon_f = TRUE;
  206. X              *(cp - 1) = 0;
  207. ***************
  208. *** 553,564 ****
  209. X  
  210. X          if (hash_f)
  211. X          {
  212. !         int    slen, n;
  213. !         for (n = 1, slen = 0; dolv[n] != (char *)NULL;
  214. !              slen += (strlen (dolv[n++]) + 1));
  215. !         dolp = strsave (putn (slen - 1), areanum);
  216. X          PUSHIO (aword, dolp, quoted ? qstrchar : strchar);
  217. X          }
  218. X  
  219. --- 560,566 ----
  220. X  
  221. X          if (hash_f)
  222. X          {
  223. !         dolp = strsave (putn (dolc - 1), areanum);
  224. X          PUSHIO (aword, dolp, quoted ? qstrchar : strchar);
  225. X          }
  226. X  
  227. ***************
  228. *** 628,638 ****
  229. X      }
  230. X      }
  231. X  
  232. !     else if (c == '+')
  233. !     dolp = strsave (cp, areanum);
  234. X  
  235. ! /* Check for unset values */
  236. X  
  237. X      if (FL_TEST ('u') && dolp == null)
  238. X      {
  239. X      print_error ("sh: unset variable %s\n", s);
  240. --- 630,678 ----
  241. X      }
  242. X      }
  243. X  
  244. ! /* String exists - other processing */
  245. X  
  246. !     else
  247. !     {
  248. !     char        *pos;        /* Position for substitute    */
  249. !     char        *tsp;
  250. !     int        mode;        /* Mode for substitute        */
  251. X  
  252. +     switch (c)
  253. +     {
  254. +         case '+':
  255. +         dolp = strsave (cp, areanum);
  256. +         break;
  257. +         case '#':            /* Remove prefix */
  258. +         case '%':            /* Remove suffix */
  259. +         mode = GM_SHORTEST;
  260. +         if (*cp == c)
  261. +         {
  262. +             mode = GM_LONGEST;
  263. +             ++cp;
  264. +         }
  265. +         if (c == '#')
  266. +         {
  267. +             if (gmatch (dolp, cp, FALSE, &pos, mode))
  268. +             dolp = strsave (pos, areanum);
  269. +         }
  270. +         else if (gmatch_suffix (dolp, cp, FALSE, &pos, mode))
  271. +         {
  272. +             tsp = strsave (dolp, areanum);
  273. +             tsp[pos - dolp] = 0;
  274. +             dolp = tsp;
  275. +         }
  276. +         break;
  277. +     }
  278. +     }
  279. + /* Check for unset values */
  280. X      if (FL_TEST ('u') && dolp == null)
  281. X      {
  282. X      print_error ("sh: unset variable %s\n", s);
  283. ***************
  284. *** 964,970 ****
  285. X  
  286. X  /* Check for a match */
  287. X  
  288. !     if (gmatch (dname, gp, TRUE))
  289. X      {
  290. X  
  291. X  /* If there are no special characters in the new full name, the file must
  292. --- 1004,1010 ----
  293. X  
  294. X  /* Check for a match */
  295. X  
  296. !     if (gmatch (dname, gp, TRUE, (char **)NULL, GM_ALL))
  297. X      {
  298. X  
  299. X  /* If there are no special characters in the new full name, the file must
  300. ***************
  301. *** 1191,1197 ****
  302. X  
  303. X          *t_drive = (char)(s_drive + 'a' - 1);
  304. X  
  305. !         if ((y_drive == s_drive) && gmatch (t_drive, pattern, TRUE))
  306. X          {
  307. X          *new_pattern = *t_drive;
  308. X          globname (new_pattern, &new_pattern[2]);
  309. --- 1231,1238 ----
  310. X  
  311. X          *t_drive = (char)(s_drive + 'a' - 1);
  312. X  
  313. !         if ((y_drive == s_drive) &&
  314. !          gmatch (t_drive, pattern, TRUE, (char **)NULL, GM_ALL))
  315. X          {
  316. X          *new_pattern = *t_drive;
  317. X          globname (new_pattern, &new_pattern[2]);
  318. Index: shell/sh8.c
  319. Prereq: 1.12
  320. *** ../sh16.3/shell/sh8.c    Fri Aug 17 21:35:41 1990
  321. --- shell/sh8.c    Tue Nov  6 19:22:21 1990
  322. ***************
  323. *** 12,18 ****
  324. X   * 2.  The sources (or parts thereof) or objects generated from the sources
  325. X   *     (or parts of sources) cannot be sold under any circumstances.
  326. X   *
  327. !  *    $Header: C:/SRC/SHELL/RCS/sh8.c 1.12 90/08/14 23:31:08 Ian_Stewartson Exp $
  328. X   *
  329. X   *    $Log:    sh8.c $
  330. X   * Revision 1.12  90/08/14  23:31:08  Ian_Stewartson
  331. --- 12,18 ----
  332. X   * 2.  The sources (or parts thereof) or objects generated from the sources
  333. X   *     (or parts of sources) cannot be sold under any circumstances.
  334. X   *
  335. !  *    $Header: C:/SRC/SHELL/RCS/sh8.c 1.12 90/08/14 23:31:08 Ian_Stewartson Exp Locker: Ian_Stewartson $
  336. X   *
  337. X   *    $Log:    sh8.c $
  338. X   * Revision 1.12  90/08/14  23:31:08  Ian_Stewartson
  339. Index: shell/sh6.c
  340. Prereq: 1.14
  341. *** ../sh16.3/shell/sh6.c    Fri Aug 17 21:35:10 1990
  342. --- shell/sh6.c    Tue Nov  6 19:22:29 1990
  343. ***************
  344. *** 13,21 ****
  345. X   * 2.  The sources (or parts thereof) or objects generated from the sources
  346. X   *     (or parts of sources) cannot be sold under any circumstances.
  347. X   *
  348. !  *    $Header: C:/SRC/SHELL/RCS/sh6.c 1.14 90/08/14 23:34:49 MS_user Exp $
  349. X   *
  350. X   *    $Log:    sh6.c $
  351. X   * Revision 1.14  90/08/14  23:34:49  MS_user
  352. X   * Changed for release 1.6.3
  353. X   * 
  354. --- 13,24 ----
  355. X   * 2.  The sources (or parts thereof) or objects generated from the sources
  356. X   *     (or parts of sources) cannot be sold under any circumstances.
  357. X   *
  358. !  *    $Header: D:/SRC/SHELL/RCS/sh6.c 1.15 90/09/11 19:42:15 Ian_Stewartson Exp $
  359. X   *
  360. X   *    $Log:    sh6.c $
  361. +  * Revision 1.15  90/09/11  19:42:15  Ian_Stewartson
  362. +  * Version 1.6.4
  363. +  * 
  364. X   * Revision 1.14  90/08/14  23:34:49  MS_user
  365. X   * Changed for release 1.6.3
  366. X   * 
  367. ***************
  368. *** 73,79 ****
  369. X  #include <string.h>
  370. X  #include "sh.h"
  371. X  
  372. ! static char    *Copy_Right1 = "MS-DOS SH Version 1.6.3 - %s (DOS %d.%d)\n";
  373. X  static char    *Copy_Right2 = "Copyright (c) Data Logic Ltd and Charles Forsyth 1990\n";
  374. X  char        **dolv;        /* Parameter array            */
  375. X  int        dolc;        /* Number of entries in parameter array    */
  376. --- 76,82 ----
  377. X  #include <string.h>
  378. X  #include "sh.h"
  379. X  
  380. ! static char    *Copy_Right1 = "MS-DOS SH Version 1.6.4 - %s (DOS %d.%d)\n";
  381. X  static char    *Copy_Right2 = "Copyright (c) Data Logic Ltd and Charles Forsyth 1990\n";
  382. X  char        **dolv;        /* Parameter array            */
  383. X  int        dolc;        /* Number of entries in parameter array    */
  384. Index: shell/sh2.c
  385. Prereq: 1.6
  386. *** ../sh16.3/shell/sh2.c    Fri Aug 17 21:34:11 1990
  387. --- shell/sh2.c    Tue Nov  6 19:22:53 1990
  388. ***************
  389. *** 13,21 ****
  390. X   * 2.  The sources (or parts thereof) or objects generated from the sources
  391. X   *     (or parts of sources) cannot be sold under any circumstances.
  392. X   *
  393. !  *    $Header: C:/SRC/SHELL/RCS/sh2.c 1.6 90/08/14 23:30:26 Ian_Stewartson Exp $
  394. X   *
  395. X   *    $Log:    sh2.c $
  396. X   * Revision 1.6  90/08/14  23:30:26  Ian_Stewartson
  397. X   * Add support for read/write IO
  398. X   * 
  399. --- 13,24 ----
  400. X   * 2.  The sources (or parts thereof) or objects generated from the sources
  401. X   *     (or parts of sources) cannot be sold under any circumstances.
  402. X   *
  403. !  *    $Header: C:/SRC/SHELL/RCS/sh2.c 1.7 90/09/11 20:00:01 Ian_Stewartson Exp $
  404. X   *
  405. X   *    $Log:    sh2.c $
  406. +  * Revision 1.7  90/09/11  20:00:01  Ian_Stewartson
  407. +  * Add support for $() POSIX functionality
  408. +  * 
  409. X   * Revision 1.6  90/08/14  23:30:26  Ian_Stewartson
  410. X   * Add support for read/write IO
  411. X   * 
  412. ***************
  413. *** 733,744 ****
  414. X      case 0:
  415. X          return c;
  416. X  
  417. X      case '$':
  418. X          *e.linep++ = (char)c;
  419. X  
  420. !         if ((c = Getc(0)) == '{') 
  421. X          {
  422. !         if ((c = collect (c, '}')) != '\0')
  423. X              return (c);
  424. X  
  425. X          goto pack;
  426. --- 736,749 ----
  427. X      case 0:
  428. X          return c;
  429. X  
  430. + /* Allow $name, ${name}, $(command) and support $[arthmetic functions] */
  431. X      case '$':
  432. X          *e.linep++ = (char)c;
  433. X  
  434. !         if (((c = Getc(0)) == '{') || (c == '('))
  435. X          {
  436. !         if ((c = collect (c, (c == '{') ? '}' : ')')) != '\0')
  437. X              return (c);
  438. X  
  439. X          goto pack;
  440. ***************
  441. *** 823,829 ****
  442. X      return c;
  443. X      }
  444. X  
  445. !     yylval.cp = strsave (e.cline, areanum);
  446. X      return WORD;
  447. X  }
  448. X  
  449. --- 828,857 ----
  450. X      return c;
  451. X      }
  452. X  
  453. ! /* Special processing for $(command) to convert it to `command` */
  454. !     if (strncmp (e.cline, "$(", 2) == 0)
  455. !     {
  456. !     yylval.cp = strsave (e.cline + 1, areanum);
  457. !     *yylval.cp = '`';
  458. !     yylval.cp[strlen (yylval.cp) - 1] = '`';
  459. !     }
  460. ! /* Otherwise, handle words beginning with a ~ */
  461. !     else if (*e.cline == '~')
  462. !     {
  463. !     char    *dir = lookup (home, FALSE)->value;
  464. !     yylval.cp = tree (strlen (e.cline) + strlen (dir));
  465. !     strcat (strcpy (yylval.cp, dir), e.cline + 1);
  466. !     }
  467. ! /* Otherwise, just save it */
  468. !     else
  469. !     yylval.cp = strsave (e.cline, areanum);
  470. X      return WORD;
  471. X  }
  472. X  
  473. Index: shell/sh7.c
  474. Prereq: 1.18
  475. *** ../sh16.3/shell/sh7.c    Fri Aug 17 21:35:57 1990
  476. --- shell/sh7.c    Tue Nov  6 19:24:17 1990
  477. ***************
  478. *** 15,81 ****
  479. X   * 2.  The sources (or parts thereof) or objects generated from the sources
  480. X   *     (or parts of sources) cannot be sold under any circumstances.
  481. X   *
  482. !  *    $Header: C:/SRC/SHELL/RCS/sh7.c 1.18 90/08/14 23:34:55 MS_user Exp $
  483. X   *
  484. X   *    $Log:    sh7.c $
  485. X   * Revision 1.18  90/08/14  23:34:55  MS_user
  486. X   * Fix directory display on change directory
  487. X   * Fix spelling mistake.
  488. !  * 
  489. X   * Revision 1.17  90/05/31  09:50:05  MS_user
  490. X   * Implement partial write when swapping to disk
  491. !  * 
  492. X   * Revision 1.16  90/04/30  19:50:44  MS_user
  493. X   * Stop search path if second character of name is colon
  494. !  * 
  495. X   * Revision 1.15  90/04/25  22:35:53  MS_user
  496. X   * Fix bug in doread to stop multi-line reads
  497. !  * 
  498. X   * Revision 1.14  90/04/25  09:21:11  MS_user
  499. X   * Change version message processing
  500. !  * 
  501. X   * Revision 1.13  90/04/03  17:59:43  MS_user
  502. X   * type didnot check for functions before searching PATH
  503. !  * 
  504. X   * Revision 1.12  90/03/27  20:33:58  MS_user
  505. X   * Clear extended file name on interrupt
  506. !  * 
  507. X   * Revision 1.11  90/03/26  20:57:38  MS_user
  508. X   * Change I/O restore so that "exec >filename" works
  509. !  * 
  510. X   * Revision 1.10  90/03/14  19:32:05  MS_user
  511. X   * Change buffered output to be re-entrant and add it to getopt
  512. !  * 
  513. X   * Revision 1.9  90/03/14  16:45:52  MS_user
  514. X   * New Open_buffer parameter
  515. !  * 
  516. X   * Revision 1.8  90/03/13  21:19:50  MS_user
  517. X   * Use the new Buffered Output routines in doecho
  518. !  * 
  519. X   * Revision 1.7  90/03/12  20:43:52  MS_user
  520. X   * Change bell test to check initialisation file
  521. !  * 
  522. X   * Revision 1.6  90/03/12  17:09:38  MS_user
  523. X   * Add a missing cast
  524. !  * 
  525. X   * Revision 1.5  90/03/09  16:06:41  MS_user
  526. X   * Add SH_BELL processing
  527. !  * 
  528. X   * Revision 1.4  90/03/06  16:50:10  MS_user
  529. X   * Add disable history option
  530. !  * 
  531. X   * Revision 1.3  90/03/05  13:52:49  MS_user
  532. X   * Changes to eval and dot functionality
  533. X   * Fix bug in escape processing in doecho
  534. X   * Add some array size checks
  535. !  * 
  536. X   * Revision 1.2  90/01/30  14:43:34  MS_user
  537. X   * Add missing author note
  538. !  * 
  539. X   * Revision 1.1  90/01/29  17:46:25  MS_user
  540. X   * Initial revision
  541. !  * 
  542. !  * 
  543. X   */
  544. X  
  545. X  #include <sys/types.h>
  546. --- 15,87 ----
  547. X   * 2.  The sources (or parts thereof) or objects generated from the sources
  548. X   *     (or parts of sources) cannot be sold under any circumstances.
  549. X   *
  550. !  *    $Header: C:/SRC/SHELL/RCS/sh7.c 1.20 90/09/19 15:33:07 Ian_Stewartson Exp $
  551. X   *
  552. X   *    $Log:    sh7.c $
  553. +  * Revision 1.20  90/09/19  15:33:07  Ian_Stewartson
  554. +  * Allow builtin commands to selected/de-selected
  555. +  * 
  556. +  * Revision 1.19  90/09/11  19:42:59  Ian_Stewartson
  557. +  * Implement builtin command
  558. +  *
  559. X   * Revision 1.18  90/08/14  23:34:55  MS_user
  560. X   * Fix directory display on change directory
  561. X   * Fix spelling mistake.
  562. !  *
  563. X   * Revision 1.17  90/05/31  09:50:05  MS_user
  564. X   * Implement partial write when swapping to disk
  565. !  *
  566. X   * Revision 1.16  90/04/30  19:50:44  MS_user
  567. X   * Stop search path if second character of name is colon
  568. !  *
  569. X   * Revision 1.15  90/04/25  22:35:53  MS_user
  570. X   * Fix bug in doread to stop multi-line reads
  571. !  *
  572. X   * Revision 1.14  90/04/25  09:21:11  MS_user
  573. X   * Change version message processing
  574. !  *
  575. X   * Revision 1.13  90/04/03  17:59:43  MS_user
  576. X   * type didnot check for functions before searching PATH
  577. !  *
  578. X   * Revision 1.12  90/03/27  20:33:58  MS_user
  579. X   * Clear extended file name on interrupt
  580. !  *
  581. X   * Revision 1.11  90/03/26  20:57:38  MS_user
  582. X   * Change I/O restore so that "exec >filename" works
  583. !  *
  584. X   * Revision 1.10  90/03/14  19:32:05  MS_user
  585. X   * Change buffered output to be re-entrant and add it to getopt
  586. !  *
  587. X   * Revision 1.9  90/03/14  16:45:52  MS_user
  588. X   * New Open_buffer parameter
  589. !  *
  590. X   * Revision 1.8  90/03/13  21:19:50  MS_user
  591. X   * Use the new Buffered Output routines in doecho
  592. !  *
  593. X   * Revision 1.7  90/03/12  20:43:52  MS_user
  594. X   * Change bell test to check initialisation file
  595. !  *
  596. X   * Revision 1.6  90/03/12  17:09:38  MS_user
  597. X   * Add a missing cast
  598. !  *
  599. X   * Revision 1.5  90/03/09  16:06:41  MS_user
  600. X   * Add SH_BELL processing
  601. !  *
  602. X   * Revision 1.4  90/03/06  16:50:10  MS_user
  603. X   * Add disable history option
  604. !  *
  605. X   * Revision 1.3  90/03/05  13:52:49  MS_user
  606. X   * Changes to eval and dot functionality
  607. X   * Fix bug in escape processing in doecho
  608. X   * Add some array size checks
  609. !  *
  610. X   * Revision 1.2  90/01/30  14:43:34  MS_user
  611. X   * Add missing author note
  612. !  *
  613. X   * Revision 1.1  90/01/29  17:46:25  MS_user
  614. X   * Initial revision
  615. !  *
  616. !  *
  617. X   */
  618. X  
  619. X  #include <sys/types.h>
  620. ***************
  621. *** 210,215 ****
  622. --- 216,222 ----
  623. X  static int        doread (C_Op *);
  624. X  static int        doeval (C_Op *);
  625. X  static int        dotrap (C_Op *);
  626. + static int        dobuiltin (C_Op *);
  627. X  static int        getsig (char *);
  628. X  static int        dobreak (C_Op *);
  629. X  static int        docontinue (C_Op *);
  630. ***************
  631. *** 225,230 ****
  632. --- 232,238 ----
  633. X  static void        setsig (int, int (*)());
  634. X  static int        rdexp (char **, int, char *);
  635. X  
  636. + static char        *not_builtin = "%s: not a builtin\n";
  637. X  static char        **test_alist;
  638. X  static struct test_op    *test_op;
  639. X  static jmp_buf        test_jmp;
  640. ***************
  641. *** 1777,1784 ****
  642. X      char        *xp;            /* In file name pointers */
  643. X      char        *xp1;
  644. X      int            n = 1;            /* Argument count    */
  645. !     int            i, fp;    
  646. X      bool        found;            /* Found flag        */
  647. X      char        *l_path;
  648. X      Fun_Ops        *fops;
  649. X  
  650. --- 1785,1793 ----
  651. X      char        *xp;            /* In file name pointers */
  652. X      char        *xp1;
  653. X      int            n = 1;            /* Argument count    */
  654. !     int            i, fp;
  655. X      bool        found;            /* Found flag        */
  656. +     bool        inb;            /* Inbuilt function    */
  657. X      char        *l_path;
  658. X      Fun_Ops        *fops;
  659. X  
  660. ***************
  661. *** 1794,1800 ****
  662. X  
  663. X      while ((cp = t->words[n++]) != (char *)NULL)
  664. X      {
  665. !     if (inbuilt (cp))
  666. X      {
  667. X          v1_puts (cp);
  668. X          v1a_puts (" is a shell internal command");
  669. --- 1803,1812 ----
  670. X  
  671. X      while ((cp = t->words[n++]) != (char *)NULL)
  672. X      {
  673. ! /* Check for currently use inbuilt version */
  674. !     if (inbuilt (cp, &inb) && inb)
  675. X      {
  676. X          v1_puts (cp);
  677. X          v1a_puts (" is a shell internal command");
  678. ***************
  679. *** 1825,1831 ****
  680. X  
  681. X          if ((xp1 = strrchr (l_path, '/')) == (char *)NULL)
  682. X          xp1 = l_path;
  683. !         
  684. X          else
  685. X          ++xp1;
  686. X  
  687. --- 1837,1843 ----
  688. X  
  689. X          if ((xp1 = strrchr (l_path, '/')) == (char *)NULL)
  690. X          xp1 = l_path;
  691. X          else
  692. X          ++xp1;
  693. X  
  694. ***************
  695. *** 1862,1925 ****
  696. X          }
  697. X      } while ((sp != (char *)NULL) && !found);
  698. X  
  699. !     if (!found)
  700. !         print_error ("%s not found\n", cp);
  701. !     }
  702. X  
  703. X      return 0;
  704. X  }
  705. X  
  706. X  /* Table of internal commands */
  707. X  
  708. X  static struct    builtin    builtin[] = {
  709. !     ".",        dodot,
  710. !     ":",        dolabel,
  711. !     "[",        dotest,
  712. !     "break",    dobreak,
  713. !     "cd",        dochdir,
  714. !     "continue",    docontinue,
  715. !     "echo",        doecho,
  716. !     "eval",        doeval,
  717. !     "exec",        doexec,
  718. !     "exit",        doexit,
  719. !     "export",    doexport,
  720. !     "getopt",    dogetopt,
  721. X  #ifndef NO_HISTORY
  722. !     "history",    dohistory,
  723. X  #endif
  724. !     "msdos",    domsdos,
  725. !     "pwd",        dopwd,
  726. !     "read",        doread,
  727. !     "readonly",    doreadonly,
  728. !     "return",    doreturn,
  729. !     "set",        doset,
  730. !     "shift",    doshift,
  731. !     "swap",        doswap,
  732. !     "test",        dotest,
  733. !     "trap",        dotrap,
  734. !     "type",        dotype,
  735. !     "umask",    doumask,
  736. !     "unset",    dounset,
  737. !     "ver",        dover,
  738. !     (char *)NULL,
  739. X  };
  740. X  
  741. X  /*
  742. X   * Look up a built in command
  743. X   */
  744. X  
  745. ! int        (*inbuilt (s))()
  746. X  register char    *s;
  747. X  {
  748. X      register struct builtin    *bp;
  749. X  
  750. X      if ((strlen (s) == 2) && isalpha (*s) && (*s != '_') && (*(s + 1) == ':'))
  751. X      return dodrive;
  752. X  
  753. X      for (bp = builtin; bp->command != (char *)NULL; bp++)
  754. X      {
  755. X      if (stricmp (bp->command, s) == 0)
  756. X          return bp->fn;
  757. X      }
  758. X  
  759. X      return (int (*)())NULL;
  760. --- 1874,1959 ----
  761. X          }
  762. X      } while ((sp != (char *)NULL) && !found);
  763. X  
  764. ! /* If not found, check for inbuilt version */
  765. X  
  766. +     if (!found)
  767. +     {
  768. +         if (inbuilt (cp, &inb))
  769. +         {
  770. +         v1_puts (cp);
  771. +         v1a_puts (" is a shell internal command");
  772. +         }
  773. +         else
  774. +         print_error ("%s not found\n", cp);
  775. +     }
  776. +     }
  777. X      return 0;
  778. X  }
  779. X  
  780. X  /* Table of internal commands */
  781. X  
  782. X  static struct    builtin    builtin[] = {
  783. !     ".",        dodot,        (BLT_ALWAYS | BLT_CURRENT),
  784. !     ":",        dolabel,    (BLT_ALWAYS | BLT_CURRENT),
  785. !     "[",        dotest,        BLT_CURRENT,
  786. !     "break",    dobreak,    BLT_CURRENT,
  787. !     "builtin",    dobuiltin,    (BLT_ALWAYS | BLT_CURRENT),
  788. !     "cd",        dochdir,    BLT_CURRENT,
  789. !     "continue",    docontinue,    BLT_CURRENT,
  790. !     "echo",        doecho,        BLT_CURRENT,
  791. !     "eval",        doeval,        BLT_CURRENT,
  792. !     "exec",        doexec,        BLT_CURRENT,
  793. !     "exit",        doexit,        BLT_CURRENT,
  794. !     "export",    doexport,    BLT_CURRENT,
  795. !     "getopt",    dogetopt,    BLT_CURRENT,
  796. X  #ifndef NO_HISTORY
  797. !     "history",    dohistory,    BLT_CURRENT,
  798. X  #endif
  799. !     "msdos",    domsdos,    BLT_CURRENT,
  800. !     "pwd",        dopwd,        BLT_CURRENT,
  801. !     "read",        doread,        BLT_CURRENT,
  802. !     "readonly",    doreadonly,    BLT_CURRENT,
  803. !     "return",    doreturn,    BLT_CURRENT,
  804. !     "set",        doset,        BLT_CURRENT,
  805. !     "shift",    doshift,    BLT_CURRENT,
  806. !     "swap",        doswap,        BLT_CURRENT,
  807. !     "test",        dotest,        BLT_CURRENT,
  808. !     "trap",        dotrap,        BLT_CURRENT,
  809. !     "type",        dotype,        BLT_CURRENT,
  810. !     "umask",    doumask,    BLT_CURRENT,
  811. !     "unset",    dounset,    BLT_CURRENT,
  812. !     "ver",        dover,        BLT_CURRENT,
  813. !     (char *)NULL,    (int (*)())NULL,    0
  814. X  };
  815. X  
  816. X  /*
  817. X   * Look up a built in command
  818. X   */
  819. X  
  820. ! int        (*inbuilt (s, b))()
  821. X  register char    *s;
  822. + bool        *b;
  823. X  {
  824. X      register struct builtin    *bp;
  825. X  
  826. + /* Check for change drive */
  827. +     *b = TRUE;
  828. X      if ((strlen (s) == 2) && isalpha (*s) && (*s != '_') && (*(s + 1) == ':'))
  829. X      return dodrive;
  830. X  
  831. + /* Search for command */
  832. +     *b = FALSE;
  833. X      for (bp = builtin; bp->command != (char *)NULL; bp++)
  834. X      {
  835. X      if (stricmp (bp->command, s) == 0)
  836. +     {
  837. +         *b = (bp->mode & BLT_CURRENT) ? TRUE : FALSE;
  838. X          return bp->fn;
  839. +     }
  840. X      }
  841. X  
  842. X      return (int (*)())NULL;
  843. ***************
  844. *** 1975,1978 ****
  845. --- 2009,2114 ----
  846. X  {
  847. X      if ((c != 0x07) || Ring_Bell ())
  848. X      write (STDOUT_FILENO, &c, 1);
  849. + }
  850. + /*
  851. +  * Builtin - either list builtins or execute it
  852. +  */
  853. + static int    dobuiltin (t)
  854. + register C_Op    *t;
  855. + {
  856. +     register struct builtin    *bp;
  857. +     int                (*shcom)(C_Op *) = (int (*)())NULL;
  858. +     int                rv = 0;
  859. +     bool            mode;
  860. +     int                action;
  861. +     int                i;
  862. +     if (t->words[1] == (char *)NULL)
  863. +     {
  864. +     for (bp = builtin; bp->command != (char *)NULL; bp++)
  865. +         v1printf ("builtin %s%s", bp->command,
  866. +               (bp->mode & BLT_CURRENT) ? " - preferred\n" : "\n");
  867. +     }
  868. + /* Check for changing options */
  869. +     else if (*t->words[1] == '-')
  870. +     {
  871. +     if (!strcmp (t->words[1], "-s"))
  872. +         action = 0;
  873. +     else if (!strcmp (t->words[1], "-a"))
  874. +         action = 1;
  875. +     else if (!strcmp (t->words[1], "-d"))
  876. +         action = 2;
  877. +     else
  878. +     {
  879. +         print_warn ("builtin: invalid flag %s\n", t->words[1]);
  880. +         return 1;
  881. +     }
  882. + /* Process the commands */
  883. +     for (i = 2; t->words[i] != (char *)NULL; ++i)
  884. +     {
  885. +         for (bp = builtin; bp->command != (char *)NULL; bp++)
  886. +         {
  887. +         if (stricmp (bp->command, t->words[i]) == 0)
  888. +         {
  889. +             switch (action)
  890. +             {
  891. +             case 0:
  892. +                 print_warn ("%s: %s\n", t->words[i],
  893. +                     (bp->mode |= BLT_CURRENT)
  894. +                         ? "builtin" : "external");
  895. +                 break;
  896. +             case 1:
  897. +                 bp->mode |= BLT_CURRENT;
  898. +                 break;
  899. +             case 2:
  900. +                 if (bp->mode & BLT_ALWAYS)
  901. +                 print_warn ("%s: always builtin\n",
  902. +                         t->words[i]);
  903. +                 else
  904. +                 bp->mode &= ~BLT_CURRENT;
  905. +                 break;
  906. +             }
  907. +             break;
  908. +         }
  909. +         }
  910. +         if (bp->command == (char *)NULL)
  911. +         {
  912. +         print_warn (not_builtin, t->words[i]);
  913. +         rv = 1;
  914. +         }
  915. +     }
  916. +     }
  917. + /* Check to see if we know about the builtin version */
  918. +     else if ((shcom = inbuilt (t->words[1], &mode)) == (int (*)())NULL)
  919. +     {
  920. +     print_warn (not_builtin, t->words[i]);
  921. +     rv = 1;
  922. +     }
  923. + /* Set up the word list correctly */
  924. +     else
  925. +     {
  926. +     t->words++;
  927. +     rv = (*shcom)(t);
  928. +     t->words--;
  929. +     }
  930. +     return rv;
  931. X  }
  932. Index: shell/sh10.c
  933. Prereq: 1.4
  934. *** ../sh16.3/shell/sh10.c    Fri Aug 17 21:32:51 1990
  935. --- shell/sh10.c    Tue Nov  6 19:25:21 1990
  936. ***************
  937. *** 12,20 ****
  938. X   * 2.  The sources (or parts thereof) or objects generated from the sources
  939. X   *     (or parts of sources) cannot be sold under any circumstances.
  940. X   *
  941. !  *    $Header: C:/SRC/SHELL/RCS/sh10.c 1.4 90/08/14 23:33:32 MS_user Exp $
  942. X   *
  943. X   *    $Log:    sh10.c $
  944. X   * Revision 1.4  90/08/14  23:33:32  MS_user
  945. X   * Fix memory bugs - Add Copy function code to code a function tree
  946. X   * before it is executed.
  947. --- 12,23 ----
  948. X   * 2.  The sources (or parts thereof) or objects generated from the sources
  949. X   *     (or parts of sources) cannot be sold under any circumstances.
  950. X   *
  951. !  *    $Header: C:/SRC/SHELL/RCS/sh10.c 1.5 90/09/11 19:40:46 Ian_Stewartson Exp $
  952. X   *
  953. X   *    $Log:    sh10.c $
  954. +  * Revision 1.5  90/09/11  19:40:46  Ian_Stewartson
  955. +  * Fix bug in case printing/deletion in functions
  956. +  * 
  957. X   * Revision 1.4  90/08/14  23:33:32  MS_user
  958. X   * Fix memory bugs - Add Copy function code to code a function tree
  959. X   * before it is executed.
  960. ***************
  961. *** 186,192 ****
  962. X      case TCASE:            /* CASE function        */
  963. X          Print_IString ("case ", 1);
  964. X          v1_puts (t->str);
  965. !         v1a_puts (" do");
  966. X          Print_Case (t->left);
  967. X          Print_IString (" esac\n", -1);
  968. X          return;
  969. --- 189,195 ----
  970. X      case TCASE:            /* CASE function        */
  971. X          Print_IString ("case ", 1);
  972. X          v1_puts (t->str);
  973. !         v1a_puts (" in");
  974. X          Print_Case (t->left);
  975. X          Print_IString (" esac\n", -1);
  976. X          return;
  977. ***************
  978. *** 624,629 ****
  979. --- 627,633 ----
  980. X      if (t->type == TLIST) 
  981. X      {
  982. X      Set_Free_Case (t->left, func);
  983. +     (*func)((char *)t->left);
  984. X      t1 = t->right;
  985. X      }
  986. X      
  987. ***************
  988. *** 638,643 ****
  989. --- 642,650 ----
  990. X      (*func)((char *)t1->words);
  991. X  
  992. X      Set_Free_ExTree (t1->left, func);
  993. +     
  994. +     if (t1 == t->right)
  995. +     (*func)((char *)t->right);
  996. X  }
  997. X  
  998. X  /*
  999. SHAR_EOF
  1000. echo 'File Patch1.6.4 is complete' &&
  1001. chmod 0644 Patch1.6.4 ||
  1002. echo 'restore of Patch1.6.4 failed'
  1003. Wc_c="`wc -c < 'Patch1.6.4'`"
  1004. test 63614 -eq "$Wc_c" ||
  1005.     echo 'Patch1.6.4: original size 63614, current size' "$Wc_c"
  1006. rm -f _shar_wnt_.tmp
  1007. fi
  1008. rm -f _shar_seq_.tmp
  1009. echo You have unpacked the last part
  1010. exit 0
  1011.  
  1012. exit 0 # Just in case...
  1013. -- 
  1014. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  1015. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  1016. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  1017. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  1018.