home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-385-Vol-1of3.iso / k / ksh48.zip / patches.os2 < prev    next >
Text File  |  1992-09-26  |  57KB  |  2,301 lines

  1. Only in new: patches.os2
  2. Only in new/sh: Makefile
  3. Only in new/sh: ksh.def
  4. Only in new/sh: os2.c
  5. diff -cbr orig/sh/alloc.c new/sh/alloc.c
  6. *** orig/sh/alloc.c    Sun May 03 18:45:01 1992
  7. --- new/sh/alloc.c    Sun May 03 18:47:14 1992
  8. ***************
  9. *** 8,13 ****
  10. --- 8,14 ----
  11.   
  12.   #include "stdh.h"
  13.   #include <setjmp.h>
  14. + #include <sys/types.h>
  15.   #include "sh.h"
  16.   
  17.   #define    ICELLS    100        /* number of Cells in small Block */
  18. diff -cbr orig/sh/c_ksh.c new/sh/c_ksh.c
  19. *** orig/sh/c_ksh.c    Sun May 03 18:45:02 1992
  20. --- new/sh/c_ksh.c    Tue Sep 08 11:39:17 1992
  21. ***************
  22. *** 53,59 ****
  23.   
  24.       v_pwd = global("PWD");
  25.       if ((pwd = strval(v_pwd)) == null) {
  26. !         setstr(v_pwd, getcwd(path, (size_t)PATH));
  27.           pwd = strval(v_pwd);
  28.       }
  29.   
  30. --- 53,60 ----
  31.   
  32.       v_pwd = global("PWD");
  33.       if ((pwd = strval(v_pwd)) == null) {
  34. !                 getcwd(path, (size_t)PATH);
  35. !         setstr(v_pwd, path);
  36.           pwd = strval(v_pwd);
  37.       }
  38.   
  39. ***************
  40. *** 78,85 ****
  41.           dir = strval(v_oldpwd = global("OLDPWD"));
  42.           prt = 1;
  43.       }
  44. !     if (dir[0] == '/' || (dir[0] == '.' && (dir[1] == '/' ||
  45. !         (dir[1] == '.' && dir[2] == '/')))) {
  46.           /*
  47.            * dir is an explicitly named path, so no CDPATH search
  48.            */
  49. --- 79,96 ----
  50.           dir = strval(v_oldpwd = global("OLDPWD"));
  51.           prt = 1;
  52.       }
  53. ! #ifdef OS2
  54. !     if (ISDIRSEP(dir[0]) || 
  55. !         (dir[0] == '.' && 
  56. !          (dir [1] == 0 || ISDIRSEP(dir[1]) ||
  57. !           (dir[1] == '.' && (dir[2] == 0 || ISDIRSEP(dir[2]))))) ||
  58. !             (isalpha(dir[0]) && dir[1] == ':') ) {
  59. ! #else
  60. !     if (ISDIRSEP(dir[0]) || 
  61. !         (dir[0] == '.' && 
  62. !          (dir[1] == 0 || ISDIRSEP(dir[1]) ||
  63. !           (dir[1] == '.' && (dir [2] == 0 || ISDIRSEP(dir[2])))))) {
  64. ! #endif
  65.           /*
  66.            * dir is an explicitly named path, so no CDPATH search
  67.            */
  68. ***************
  69. *** 96,102 ****
  70. --- 107,117 ----
  71.           cdpath = strval(global("CDPATH"));
  72.           while ( !done && cdpath != NULL ) {
  73.               cp = path;
  74. + #ifdef OS2
  75. +             while (*cdpath && *cdpath != ';')
  76. + #else
  77.               while (*cdpath && *cdpath != ':')
  78. + #endif
  79.                   *cp++ = *cdpath++;
  80.               if (*cdpath == '\0')
  81.                   cdpath = NULL;
  82. ***************
  83. *** 103,109 ****
  84.               else
  85.                   cdpath++;
  86.               if (prt = (cp > path)) {
  87. !                 *cp++ = '/';
  88.                   (void) strcpy( cp, dir );
  89.                   cp = path;
  90.               } else
  91. --- 118,124 ----
  92.               else
  93.                   cdpath++;
  94.               if (prt = (cp > path)) {
  95. !                 *cp++ = DIRSEP;
  96.                   (void) strcpy( cp, dir );
  97.                   cp = path;
  98.               } else
  99. ***************
  100. *** 124,130 ****
  101. --- 139,150 ----
  102.        * Keep track of OLDPWD and PWD
  103.        */
  104.       oldpwd = pwd;
  105. + #ifdef OS2
  106. +         getcwd(path, (size_t)PATH);
  107. +         pwd = path;
  108. + #else
  109.       pwd = newd;
  110. + #endif
  111.       if (!v_oldpwd)
  112.           v_oldpwd = global("OLDPWD");
  113.       if (oldpwd && *oldpwd)
  114. ***************
  115. *** 565,570 ****
  116. --- 585,597 ----
  117.   
  118.       return 0;
  119.   }
  120. + int
  121. + c_nothing(wp)
  122. +     register char **wp;
  123. + {
  124. +     return 0;
  125. + }
  126.   #endif
  127.   
  128.   extern    c_fc();
  129. ***************
  130. *** 585,590 ****
  131. --- 612,618 ----
  132.       {"fc", c_fc},
  133.       {"jobs", c_jobs},
  134.       {"kill", c_kill},
  135. +         {"extproc", c_nothing},
  136.   #ifdef JOBS
  137.       {"fg", c_fgbg},
  138.       {"bg", c_fgbg},
  139. diff -cbr orig/sh/c_sh.c new/sh/c_sh.c
  140. *** orig/sh/c_sh.c    Sun May 03 18:45:02 1992
  141. --- new/sh/c_sh.c    Sun Sep 06 20:08:01 1992
  142. ***************
  143. *** 11,16 ****
  144. --- 11,17 ----
  145.   #include <signal.h>
  146.   #include <setjmp.h>
  147.   #include <unistd.h>        /* getcwd */
  148. + #include <time.h>
  149.   #include <sys/times.h>
  150.   #include "sh.h"
  151.   
  152. ***************
  153. *** 55,61 ****
  154.       if ((cp = wp[1]) == NULL) {
  155.           i = umask(0);
  156.           umask(i);
  157. !         printf("%#3.3o\n", i);    /* should this be shell output? */
  158.       } else {
  159.           for (i = 0; *cp>='0' && *cp<='7'; cp++)
  160.               i = i*8 + (*cp-'0');
  161. --- 56,62 ----
  162.       if ((cp = wp[1]) == NULL) {
  163.           i = umask(0);
  164.           umask(i);
  165. !         printf("%03o\n", i);    /* should this be shell output? */
  166.       } else {
  167.           for (i = 0; *cp>='0' && *cp<='7'; cp++)
  168.               i = i*8 + (*cp-'0');
  169. diff -cbr orig/sh/c_test.c new/sh/c_test.c
  170. *** orig/sh/c_test.c    Sun May 03 18:45:02 1992
  171. --- new/sh/c_test.c    Sun Sep 06 20:09:00 1992
  172. ***************
  173. *** 279,285 ****
  174. --- 279,289 ----
  175.       case FILCDEV:
  176.           return stat(nm, &s) == 0 && (s.st_mode & S_IFMT) == S_IFCHR;
  177.       case FILBDEV:
  178. + #ifdef S_IFBLK
  179.           return stat(nm, &s) == 0 && (s.st_mode & S_IFMT) == S_IFBLK;
  180. + #else
  181. +         return 0;
  182. + #endif
  183.       case FILFIFO:
  184.   #ifdef S_IFIFO
  185.           return stat(nm, &s) == 0 && (s.st_mode & S_IFMT) == S_IFIFO;
  186. ***************
  187. *** 287,297 ****
  188. --- 291,313 ----
  189.           return 0;
  190.   #endif
  191.       case FILSETU:
  192. + #ifdef S_ISUID
  193.           return stat(nm, &s) == 0 && (s.st_mode & S_ISUID) == S_ISUID;
  194. + #else
  195. +         return 0;
  196. + #endif
  197.       case FILSETG:
  198. + #ifdef S_ISGID
  199.           return stat(nm, &s) == 0 && (s.st_mode & S_ISGID) == S_ISGID;
  200. + #else
  201. +         return 0;
  202. + #endif
  203.       case FILSTCK:
  204. + #ifdef S_ISVTX
  205.           return stat(nm, &s) == 0 && (s.st_mode & S_ISVTX) == S_ISVTX;
  206. + #else
  207. +         return 0;
  208. + #endif
  209.       case FILGZ:
  210.           return stat(nm, &s) == 0 && s.st_size > 0L;
  211.       case FILTT:
  212. diff -cbr orig/sh/config.h new/sh/config.h
  213. *** orig/sh/config.h    Tue Aug 25 15:21:05 1992
  214. --- new/sh/config.h    Sun Sep 06 19:28:14 1992
  215. ***************
  216. *** 13,19 ****
  217.   
  218.   #define    EMACS                /* EMACS-like mode */
  219.   #define    VI                /* vi-like mode */
  220. ! #define    JOBS                /* job control */
  221.   
  222.   #ifndef SIGINT
  223.   #include <signal.h>
  224. --- 13,19 ----
  225.   
  226.   #define    EMACS                /* EMACS-like mode */
  227.   #define    VI                /* vi-like mode */
  228. ! /* #define    JOBS                /* job control */
  229.   
  230.   #ifndef SIGINT
  231.   #include <signal.h>
  232. ***************
  233. *** 30,36 ****
  234. --- 30,39 ----
  235.    * or whatever does work.  You may find it necessary to undef
  236.    * USE_SIGACT, if so please report it.
  237.    */
  238. + #ifndef OS2
  239.   #define USE_SIGACT            /* POSIX signal handling */
  240. + #endif
  241.   /* 
  242.    * These control how sigact.c implements sigaction()
  243.    * If you don't define any of them it will try and work it out 
  244. ***************
  245. *** 46,52 ****
  246.   
  247.   /* #define    FASCIST            /* Fascist getopts */
  248.   #define    SHARPBANG            /* Hack to handle #! */
  249. ! /* #define    SILLY            /* Game of life in EMACS mode */
  250.   /* #define    SWTCH            /* Handle SWTCH for shl(1) */
  251.   
  252.   /*
  253. --- 49,55 ----
  254.   
  255.   /* #define    FASCIST            /* Fascist getopts */
  256.   #define    SHARPBANG            /* Hack to handle #! */
  257. ! #define    SILLY            /* Game of life in EMACS mode */
  258.   /* #define    SWTCH            /* Handle SWTCH for shl(1) */
  259.   
  260.   /*
  261. ***************
  262. *** 55,61 ****
  263.    *   bind '^[^['=complete-list
  264.    * to their .kshrc
  265.    */
  266. ! /*#define COMPLETE_LIST            /* default to Emacs style completion */
  267.   /*
  268.    * ALTERNATIONS is csh not ksh, but it is such a nice feature...
  269.    */
  270. --- 58,64 ----
  271.    *   bind '^[^['=complete-list
  272.    * to their .kshrc
  273.    */
  274. ! #define COMPLETE_LIST            /* default to Emacs style completion */
  275.   /*
  276.    * ALTERNATIONS is csh not ksh, but it is such a nice feature...
  277.    */
  278. diff -cbr orig/sh/edit.c new/sh/edit.c
  279. *** orig/sh/edit.c    Tue Aug 25 15:20:10 1992
  280. --- new/sh/edit.c    Tue Sep 01 08:22:29 1992
  281. ***************
  282. *** 84,89 ****
  283. --- 84,93 ----
  284.   int
  285.   x_getc()
  286.   {
  287. + #ifdef OS2
  288. +   char c = _read_kbd(0, 1, 0);
  289. +   return c == 0 ? 0xE0 : c;
  290. + #else
  291.     char c;
  292.   
  293.     /*
  294. ***************
  295. *** 103,108 ****
  296. --- 107,113 ----
  297.         return -1;
  298.       }
  299.       return c & 0x7F;
  300. + #endif
  301.   }
  302.   
  303.   void
  304. ***************
  305. *** 343,348 ****
  306. --- 348,372 ----
  307.   
  308.   #else    /* !_BSD */
  309.   
  310. + #ifdef OS2
  311. + bool_t
  312. + x_mode(onoff)
  313. +     bool_t          onoff;
  314. + {
  315. +     bool_t          prev;
  316. +     if (x_cur_mode == onoff)
  317. +         return x_cur_mode;
  318. +     prev = x_cur_mode;
  319. +     x_cur_mode = onoff;
  320. +     /* setkbdmode(onoff); */
  321. +     return prev;
  322. + }
  323. + #else
  324.   bool_t
  325.   x_mode(onoff)
  326.   bool_t    onoff;
  327. ***************
  328. *** 396,401 ****
  329. --- 420,426 ----
  330.       }
  331.       return prev;
  332.   }
  333. + #endif  /* OS2 */
  334.   #endif    /* _BSD */
  335.   
  336.   
  337. ***************
  338. *** 427,432 ****
  339. --- 452,462 ----
  340.       cp++;
  341.       count++;
  342.         }
  343. +       else if ( *cp == '.' )
  344. +       {
  345. +     cp++;
  346. +     count += strlen(strval(global("PWD")));
  347. +       }
  348.         else
  349.         {
  350.       register int i = source->line;
  351. diff -cbr orig/sh/emacs.c new/sh/emacs.c
  352. *** orig/sh/emacs.c    Tue Aug 25 15:20:11 1992
  353. --- new/sh/emacs.c    Tue Sep 01 09:04:22 1992
  354. ***************
  355. *** 4,9 ****
  356. --- 4,11 ----
  357.    *  created by Ron Natalie at BRL
  358.    *  modified by Doug Kingston, Doug Gwyn, and Lou Salkind
  359.    *  adapted to PD ksh by Eric Gisin
  360. +  *  Modified Sep 1991 by Kai Uwe Rommel for OS/2:
  361. +  *  8 bit support, 3rd meta key (extended keys)
  362.    */
  363.   
  364.   #include "config.h"
  365. ***************
  366. *** 16,21 ****
  367. --- 18,28 ----
  368.   #include "stdh.h"
  369.   #include <signal.h>
  370.   #include <sys/stat.h>
  371. + #ifdef OS2
  372. + #include <memory.h>
  373. + extern char *index_sep(char *);
  374. + extern char *rindex_sep(char *);
  375. + #endif
  376.   #include <dirent.h>
  377.   #include <unistd.h>
  378.   #include <fcntl.h>
  379. ***************
  380. *** 64,79 ****
  381.   #define    iscfs(c)    (c == ' ' || c == '\t')    /* Separator for completion */
  382.   #define    ismfs(c)    (!(isalnum(c)|| c == '$'))  /* Separator for motion */
  383.   #define    BEL        0x07
  384. ! #define    CMASK        0x7F    /* 7-bit ASCII character mask */
  385.   
  386. ! #define X_TABSZ    128            /* size of keydef tables etc */
  387.   
  388.   static    int    x_prefix1 = CTRL('['), x_prefix2 = CTRL('X');
  389.   static    char   **x_histp;    /* history position */
  390.   static    char   **x_nextcmdp;    /* for newline-and-next */
  391.   static    char    *xmp;        /* mark pointer */
  392.   static    int    (*x_last_command)();
  393. ! static    struct    x_ftab const *(*x_tab)[X_TABSZ] = NULL; /* key definition */
  394.   static    char    *(*x_atab)[X_TABSZ] = NULL; /* macro definitions */
  395.   #define    KILLSIZE    20
  396.   static    char    *killstack[KILLSIZE];
  397. --- 71,88 ----
  398.   #define    iscfs(c)    (c == ' ' || c == '\t')    /* Separator for completion */
  399.   #define    ismfs(c)    (!(isalnum(c)|| c == '$'))  /* Separator for motion */
  400.   #define    BEL        0x07
  401. ! #define    CMASK        0xFF    /* 7-bit ASCII character mask */
  402.   
  403. ! #define X_TABS    4            /* number of keydef tables etc */
  404. ! #define X_TABSZ    256            /* size of keydef tables etc */
  405.   
  406.   static    int    x_prefix1 = CTRL('['), x_prefix2 = CTRL('X');
  407. + static    int    x_prefix3 = 0xE0;
  408.   static    char   **x_histp;    /* history position */
  409.   static    char   **x_nextcmdp;    /* for newline-and-next */
  410.   static    char    *xmp;        /* mark pointer */
  411.   static    int    (*x_last_command)();
  412. ! static    struct    x_ftab *(*x_tab)[X_TABSZ] = NULL; /* key definition */
  413.   static    char    *(*x_atab)[X_TABSZ] = NULL; /* macro definitions */
  414.   #define    KILLSIZE    20
  415.   static    char    *killstack[KILLSIZE];
  416. ***************
  417. *** 123,128 ****
  418. --- 132,138 ----
  419.   static int      x_literal   ARGS((int c));
  420.   static int      x_meta1     ARGS((int c));
  421.   static int      x_meta2     ARGS((int c));
  422. + static int      x_meta3     ARGS((int c));
  423.   static int      x_kill      ARGS((int c));
  424.   static void     x_push      ARGS((int nchars));
  425.   static int      x_yank      ARGS((int c));
  426. ***************
  427. *** 158,165 ****
  428.   static int      x_set_arg   ARGS((int c));
  429.   static int      x_prev_histword ARGS((void));
  430.   static int      x_fold_case ARGS((int c));
  431.   
  432. ! static    struct x_ftab const x_ftab[] = {
  433.        {x_insert,    "auto-insert",        0,     0,    0 },
  434.       {x_error,    "error",        0,     0,    0 },
  435.        {x_ins_string,    "macro-string",        0,     0,    XF_NOBIND|XF_ALLOC},
  436. --- 168,178 ----
  437.   static int      x_set_arg   ARGS((int c));
  438.   static int      x_prev_histword ARGS((void));
  439.   static int      x_fold_case ARGS((int c));
  440. + static int    x_clear_scr ARGS((int c));
  441. + static int    x_list_jobs ARGS((int c));
  442.   
  443. ! static    struct x_ftab x_ftab[] = {
  444.        {x_insert,    "auto-insert",        0,     0,    0 },
  445.       {x_error,    "error",        0,     0,    0 },
  446.        {x_ins_string,    "macro-string",        0,     0,    XF_NOBIND|XF_ALLOC},
  447. ***************
  448. *** 167,173 ****
  449.       {x_eot_del,    "eot-or-delete",    0, CTRL('D'),    0 },
  450.       {x_del_bword,    "delete-word-backward",    1, CTRL('H'),    0 },
  451.       {x_mv_bword,    "backward-word",     1,    'b',    0 },
  452. !     {x_del_line,    "kill-line",        0,     0,    0 },
  453.       {x_abort,    "abort",        0,    0,    0 },
  454.       {x_noop,    "no-op",        0,    0,    0 },
  455.   /* Do not move the above! */
  456. --- 180,186 ----
  457.       {x_eot_del,    "eot-or-delete",    0, CTRL('D'),    0 },
  458.       {x_del_bword,    "delete-word-backward",    1, CTRL('H'),    0 },
  459.       {x_mv_bword,    "backward-word",     1,    'b',    0 },
  460. !     {x_del_line,    "kill-line",        0, CTRL('U'),    0 },
  461.       {x_abort,    "abort",        0,    0,    0 },
  462.       {x_noop,    "no-op",        0,    0,    0 },
  463.   /* Do not move the above! */
  464. ***************
  465. *** 188,196 ****
  466.       {x_end_hist,    "end-of-history",    1,    '>',    0},
  467.       {x_mv_end,    "end-of-line",        0, CTRL('E'),    0 },
  468.       {x_mv_begin,    "beginning-of-line",    0, CTRL('A'),    0 },
  469. !     {x_draw_line,    "redraw",        0, CTRL('L'),    0 },
  470.       {x_meta1,    "prefix-1",        0, CTRL('['),    0 },
  471.       {x_meta2,    "prefix-2",        0, CTRL('X'),    0 },
  472.       {x_kill,    "kill-to-eol",        0, CTRL('K'),    0 },
  473.       {x_yank,    "yank",            0, CTRL('Y'),    0 },
  474.       {x_meta_yank,    "yank-pop",         1,    'y',    0 },
  475. --- 201,211 ----
  476.       {x_end_hist,    "end-of-history",    1,    '>',    0},
  477.       {x_mv_end,    "end-of-line",        0, CTRL('E'),    0 },
  478.       {x_mv_begin,    "beginning-of-line",    0, CTRL('A'),    0 },
  479. !     {x_draw_line,    "redraw",        0,     0,    0 },
  480. !     {x_clear_scr,    "clear-screen",        0, CTRL('L'),    0 },
  481.       {x_meta1,    "prefix-1",        0, CTRL('['),    0 },
  482.       {x_meta2,    "prefix-2",        0, CTRL('X'),    0 },
  483. +     {x_meta3,    "prefix-3",        0, 0xE0,    0 },
  484.       {x_kill,    "kill-to-eol",        0, CTRL('K'),    0 },
  485.       {x_yank,    "yank",            0, CTRL('Y'),    0 },
  486.       {x_meta_yank,    "yank-pop",         1,    'y',    0 },
  487. ***************
  488. *** 213,220 ****
  489.       {x_enumerate,    "list",            1,    '?',    0 },
  490.       {x_comp_file,    "complete-file",    1, CTRL('X'),    0 },
  491.       {x_comp_comm,    "complete-command",    2, CTRL('['),    0 },
  492. !     {x_list_file,    "list-file",        0,     0,    0 },
  493.       {x_list_comm,    "list-command",        2,    '?',    0 },
  494.       {x_nl_next_com,    "newline-and-next",    0, CTRL('O'),    0 },
  495.       {x_set_mark,    "set-mark-command",    1,    ' ',    0 },
  496.       {x_kill_region,    "kill-region",        0, CTRL('W'),    0 },
  497. --- 228,236 ----
  498.       {x_enumerate,    "list",            1,    '?',    0 },
  499.       {x_comp_file,    "complete-file",    1, CTRL('X'),    0 },
  500.       {x_comp_comm,    "complete-command",    2, CTRL('['),    0 },
  501. !     {x_list_file,    "list-file",        2, CTRL('Y'),    0 },
  502.       {x_list_comm,    "list-command",        2,    '?',    0 },
  503. +         {x_list_jobs,   "list-jobs",            2,      'j',    0 },
  504.       {x_nl_next_com,    "newline-and-next",    0, CTRL('O'),    0 },
  505.       {x_set_mark,    "set-mark-command",    1,    ' ',    0 },
  506.       {x_kill_region,    "kill-region",        0, CTRL('W'),    0 },
  507. ***************
  508. *** 263,269 ****
  509.       char *buf;
  510.       size_t len;
  511.   {
  512. !     char    c;
  513.       int    i;
  514.       int   (*func)();
  515.       extern    x_insert();
  516. --- 279,285 ----
  517.       char *buf;
  518.       size_t len;
  519.   {
  520. !     int    c;
  521.       int    i;
  522.       int   (*func)();
  523.       extern    x_insert();
  524. ***************
  525. *** 832,837 ****
  526. --- 848,854 ----
  527.       xlp_valid = TRUE;
  528.       *xcp = 0;
  529.       xmp = NULL;
  530. +     if ( c != -1 )
  531.       x_redraw(j);
  532.       return KSTD;
  533.   }
  534. ***************
  535. *** 961,966 ****
  536. --- 978,989 ----
  537.   }
  538.   
  539.   static int
  540. + x_meta3(c) {
  541. +         x_curprefix = 3;
  542. +         return KPREF;
  543. + }
  544. + static int
  545.   x_kill(c)  {
  546.       int    i;
  547.   
  548. ***************
  549. *** 1028,1033 ****
  550. --- 1051,1057 ----
  551.       xlp = xep = xcp = xbp = xbuf;
  552.       xlp_valid = TRUE;
  553.       *xcp = 0;
  554. +     x_del_line(-1);
  555.       return KINTR;
  556.   }
  557.   
  558. ***************
  559. *** 1078,1084 ****
  560.           /* XXX -- should handle \^ escape? */
  561.           if (*cp == '^')  {
  562.               cp++;
  563. !             if (*cp >= '?')    /* includes '?'; ASCII */
  564.                   *op++ = CTRL(*cp);
  565.               else  {
  566.                   *op++ = '^';
  567. --- 1102,1110 ----
  568.           /* XXX -- should handle \^ escape? */
  569.           if (*cp == '^')  {
  570.               cp++;
  571. !                     if (*cp == '0')
  572. !                         *op++ = 0xE0;
  573. !                         else if (*cp >= '?')    /* includes '?'; ASCII */
  574.                   *op++ = CTRL(*cp);
  575.               else  {
  576.                   *op++ = '^';
  577. ***************
  578. *** 1101,1106 ****
  579. --- 1127,1136 ----
  580.       if (c < ' ' || c == 0x7F)  { /* ASCII */
  581.           *p++ = '^';
  582.           *p++ = (c == 0x7F) ? '?' : (c | 0x40);
  583. +         }
  584. +         else if (c == 0xE0) {
  585. +             *p++ = '^';
  586. +                 *p++ = '0';
  587.       } else
  588.           *p++ = c;
  589.       *p = 0;
  590. ***************
  591. *** 1115,1120 ****
  592. --- 1145,1152 ----
  593.           shellf("%s", x_mapout(x_prefix1));
  594.       if (prefix == 2)
  595.           shellf("%s", x_mapout(x_prefix2));
  596. +         if (prefix == 3)
  597. +               shellf("%s", x_mapout(x_prefix3));
  598.       shellf("%s = ", x_mapout(key));
  599.       if (x_tab[prefix][key]->xf_func != x_ins_string)
  600.           shellf("%s\n", x_tab[prefix][key]->xf_name);
  601. ***************
  602. *** 1127,1142 ****
  603.       char *a1, *a2;
  604.       int macro;        /* bind -m */
  605.   {
  606. !     struct x_ftab const *fp;
  607.       int prefix, key;
  608.       char *sp = NULL;
  609.   
  610.       if (x_tab == NULL)
  611. !         errorf("cannot bind, not a tty\n");
  612.   
  613.       if (a1 == NULL) {
  614. !         for (prefix = 0; prefix < 3; prefix++)
  615. !             for (key = 0; key < 0x80; key++) {
  616.               fp = x_tab[prefix][key];
  617.               if (fp == NULL ||
  618.                   fp->xf_func == x_insert || fp->xf_func == x_error)
  619. --- 1159,1175 ----
  620.       char *a1, *a2;
  621.       int macro;        /* bind -m */
  622.   {
  623. !     struct x_ftab *fp;
  624.       int prefix, key;
  625.       char *sp = NULL;
  626.   
  627.       if (x_tab == NULL)
  628. !                 return;
  629. !         /* errorf("cannot bind, not a tty\n"); */
  630.   
  631.       if (a1 == NULL) {
  632. !         for (prefix = 0; prefix < X_TABS; prefix++)
  633. !             for (key = 0; key < X_TABSZ; key++) {
  634.               fp = x_tab[prefix][key];
  635.               if (fp == NULL ||
  636.                   fp->xf_func == x_insert || fp->xf_func == x_error)
  637. ***************
  638. *** 1156,1161 ****
  639. --- 1189,1197 ----
  640.           if (x_tab[prefix][key]->xf_func == x_meta2)
  641.               prefix = 2;
  642.           else
  643. +                 if (x_tab[prefix][key]->xf_func == x_meta3)
  644. +                      prefix = 3;
  645. +         else
  646.               break;
  647.       }
  648.   
  649. ***************
  650. *** 1176,1181 ****
  651. --- 1212,1219 ----
  652.               x_prefix1 = key;
  653.           if (fp->xf_func == x_meta2)
  654.               x_prefix2 = key;
  655. +                 if (fp->xf_func == x_meta3)
  656. +                      x_prefix3 = key;
  657.       } else {
  658.           fp = xft_ins_string;
  659.           x_mapin(a2);
  660. ***************
  661. *** 1192,1217 ****
  662.   x_init_emacs()
  663.   {
  664.       register int i, j;
  665. !     struct x_ftab const *fp;
  666.   
  667.       ainit(AEDIT);
  668.   
  669. !     x_tab = (struct x_ftab *(*)[X_TABSZ]) alloc(sizeofN(*x_tab, 3), AEDIT);
  670. !     for (j = 0; j < 128; j++)
  671.           x_tab[0][j] = xft_insert;
  672. !     for (i = 1; i < 3; i++)
  673. !         for (j = 0; j < 128; j++)
  674.               x_tab[i][j] = xft_error;
  675.       for (fp = x_ftab; fp->xf_func; fp++)
  676.           if (fp->xf_db_char || fp->xf_db_tab)
  677.               x_tab[fp->xf_db_tab][fp->xf_db_char] = fp;
  678.   
  679. !     x_atab = (char *(*)[X_TABSZ]) alloc(sizeofN(*x_atab, 3), AEDIT);
  680. !     for (i = 1; i < 3; i++)
  681. !         for (j = 0; j < 128; j++)
  682.               x_atab[i][j] = NULL;
  683.   }
  684.   
  685.   void
  686.   x_emacs_keys(erase, kill, werase, intr, quit)
  687.       int erase, kill, werase, intr, quit;
  688. --- 1230,1263 ----
  689.   x_init_emacs()
  690.   {
  691.       register int i, j;
  692. !     struct x_ftab *fp;
  693.   
  694.       ainit(AEDIT);
  695.   
  696. !     x_tab = (struct x_ftab *(*)[X_TABSZ]) alloc(sizeofN(*x_tab, X_TABS), AEDIT);
  697. !     for (j = 0; j < X_TABSZ; j++)
  698.           x_tab[0][j] = xft_insert;
  699. !     for (i = 1; i < X_TABS; i++)
  700. !         for (j = 0; j < X_TABSZ; j++)
  701.               x_tab[i][j] = xft_error;
  702.       for (fp = x_ftab; fp->xf_func; fp++)
  703.           if (fp->xf_db_char || fp->xf_db_tab)
  704.               x_tab[fp->xf_db_tab][fp->xf_db_char] = fp;
  705.   
  706. !     x_atab = (char *(*)[X_TABSZ]) alloc(sizeofN(*x_atab, X_TABS), AEDIT);
  707. !     for (i = 1; i < X_TABS; i++)
  708. !         for (j = 0; j < X_TABSZ; j++)
  709.               x_atab[i][j] = NULL;
  710.   }
  711.   
  712. + static int
  713. + x_clear_scr(c)
  714. + {
  715. +     write(1, "\033[H\033[J", 6);
  716. +     x_redraw(0);
  717. +     return KSTD;
  718. + }
  719.   void
  720.   x_emacs_keys(erase, kill, werase, intr, quit)
  721.       int erase, kill, werase, intr, quit;
  722. ***************
  723. *** 1357,1371 ****
  724.   
  725.           if (strcmp(dirnam, ".") == 0)
  726.               *buf = '\0';
  727. !         else if (strcmp(dirnam, "/") == 0)
  728. !             (void)strcpy(buf, "/");
  729.           else
  730. !             (void)strcat(strcpy(buf, dirnam), "/");
  731.           (void)strcat(buf, name);
  732.           if (stat(buf, &statb)==0)
  733.               if (S_ISDIR(statb.st_mode))
  734.                   type = '/';
  735. !             else if (S_ISREG(statb.st_mode) && access(buf, 01)==0)
  736.                   type = '*';
  737.           if (type)
  738.               ++len;
  739. --- 1403,1418 ----
  740.   
  741.           if (strcmp(dirnam, ".") == 0)
  742.               *buf = '\0';
  743. !         else if (strcmp(dirnam, DIRSEPSTR) == 0)
  744. !             (void)strcpy(buf, DIRSEPSTR);
  745.           else
  746. !             (void)strcat(strcpy(buf, dirnam), DIRSEPSTR);
  747.           (void)strcat(buf, name);
  748.           if (stat(buf, &statb)==0)
  749.               if (S_ISDIR(statb.st_mode))
  750.                   type = '/';
  751. !             else if (S_ISREG(statb.st_mode) && 
  752. !                  (statb.st_mode & S_IEXEC) != 0)
  753.                   type = '*';
  754.           if (type)
  755.               ++len;
  756. ***************
  757. *** 1451,1456 ****
  758. --- 1498,1512 ----
  759.       compl_file(0);
  760.       return KSTD;
  761.   }
  762. + static int
  763. + x_list_jobs(c)
  764. +   int c;
  765. + {
  766. +         j_jobs();
  767. +         x_redraw(-1);
  768. +         return KSTD;
  769. + }
  770.   static int
  771.   x_comp_list(c)   {
  772.       compl_dec(2);
  773. ***************
  774. *** 1460,1466 ****
  775.   static void compl_dec(type) {     char    *cp;     cp = xcp;
  776.       while (cp != xbuf && !iscfs(*cp))
  777.           cp--;
  778. !     if (cp == xbuf && strchr(cp, '/') == NULL)
  779.           compl_command(type);
  780.       else
  781.           compl_file(type);
  782. --- 1516,1522 ----
  783.   static void compl_dec(type) {     char    *cp;     cp = xcp; 
  784.       while (cp != xbuf && !iscfs(*cp))
  785.           cp--;
  786. !     if (cp == xbuf && index_sep(cp) == NULL)
  787.           compl_command(type);
  788.       else
  789.           compl_file(type);
  790. ***************
  791. *** 1510,1520 ****
  792.       *cp = 0;
  793.       strcpy(buf, cp = substitute(buf, DOTILDE));
  794.       afree((void*)cp, ATEMP);
  795. !     lastp = strrchr(buf, '/');
  796.       if (lastp)
  797.           *lastp = 0;
  798.   
  799. !     dirnam = (lastp == NULL) ? "." : (lastp == buf) ? "/" : buf;
  800.       dirp = opendir(dirnam);
  801.       if (dirp == NULL) {
  802.           x_putc(BEL);
  803. --- 1566,1576 ----
  804.       *cp = 0;
  805.       strcpy(buf, cp = substitute(buf, DOTILDE));
  806.       afree((void*)cp, ATEMP);
  807. !     lastp = rindex_sep(buf);
  808.       if (lastp)
  809.           *lastp = 0;
  810.   
  811. !     dirnam = (lastp == NULL) ? "." : (lastp == buf) ? DIRSEPSTR : buf;
  812.       dirp = opendir(dirnam);
  813.       if (dirp == NULL) {
  814.           x_putc(BEL);
  815. ***************
  816. *** 1564,1575 ****
  817.                   buf[0] = 0;
  818.               else if (lastp == buf + 1)  {
  819.                   buf[1] = 0;
  820. !                 buf[0] = '/';
  821.               }  else
  822. !                 (void)strcat(buf, "/");
  823.               (void)strcat(buf, bug);
  824.               if (stat(buf, &statb) == 0 && S_ISDIR(statb.st_mode))
  825. !                 x_ins("/");
  826.               else
  827.                   x_ins(" ");
  828.           }
  829. --- 1620,1632 ----
  830.                   buf[0] = 0;
  831.               else if (lastp == buf + 1)  {
  832.                   buf[1] = 0;
  833. !                 buf[0] = DIRSEP;
  834.               }  else
  835. !                 (void)strcat(buf, DIRSEPSTR);
  836.               (void)strcat(buf, bug);
  837.               if (stat(buf, &statb) == 0 && S_ISDIR(statb.st_mode))
  838. !                 x_ins("/" /* DIRSEPSTR */);
  839. !          /* conflict with \ at end of line in OS/2 mode ! */
  840.               else
  841.                   x_ins(" ");
  842.           }
  843. ***************
  844. *** 1726,1732 ****
  845.     if (hp < history || hp > histptr)
  846.     {
  847.       x_putc(BEL);
  848. !     return;
  849.     }
  850.     cp = *hp;
  851.     if (x_last_command != x_set_arg)
  852. --- 1783,1789 ----
  853.     if (hp < history || hp > histptr)
  854.     {
  855.       x_putc(BEL);
  856. !     return KSTD;
  857.     }
  858.     cp = *hp;
  859.     if (x_last_command != x_set_arg)
  860. diff -cbr orig/sh/eval.c new/sh/eval.c
  861. *** orig/sh/eval.c    Tue Aug 25 15:21:05 1992
  862. --- new/sh/eval.c    Sun Sep 06 20:11:15 1992
  863. ***************
  864. *** 9,14 ****
  865. --- 9,18 ----
  866.   #include "stdh.h"
  867.   #include <errno.h>
  868.   #include <setjmp.h>
  869. + #ifdef OS2
  870. + #include <sys/types.h>
  871. + #include <stdlib.h>
  872. + #endif
  873.   #include <unistd.h>
  874.   #include <dirent.h>
  875.   #include <pwd.h>
  876. ***************
  877. *** 789,798 ****
  878.       }
  879.   
  880.       if (dp > ds)
  881. !         *dp++ = '/';
  882. !     while (*sp == '/')
  883.           *dp++ = *sp++;
  884. !     np = strchr(sp, '/');
  885.       if (np != NULL)
  886.           *np++ = 0;
  887.   
  888. --- 793,802 ----
  889.       }
  890.   
  891.       if (dp > ds)
  892. !         *dp++ = DIRSEP;
  893. !     while (ISDIRSEP(*sp))
  894.           *dp++ = *sp++;
  895. !     np = index_sep(sp);
  896.       if (np != NULL)
  897.           *np++ = 0;
  898.   
  899. ***************
  900. *** 833,839 ****
  901.       }
  902.   
  903.       if (np != NULL)
  904. !         *--np = '/';
  905.   }
  906.   
  907.   /* remove MAGIC from string */
  908. --- 837,843 ----
  909.       }
  910.   
  911.       if (np != NULL)
  912. !         *--np = DIRSEP;
  913.   }
  914.   
  915.   /* remove MAGIC from string */
  916. ***************
  917. *** 880,890 ****
  918.       }
  919.   
  920.       dp = NULL;    /* no output substitution */
  921. !     if (cp[1] == 0 || cp[1] == '/' || cp[1] == ':') /* ~ or ~/ */
  922.           dp = strval(global("HOME")), cp += 1;
  923. !     else if (cp[1] == '+' && (cp[2] == '/' || cp[2] == ':' || cp[2] == 0))
  924.           dp = strval(global("PWD")), cp += 2;
  925. !     else if (cp[1] == '-' && (cp[2] == '/' || cp[2] == ':' || cp[2] == 0))
  926.           dp = strval(global("OLDPWD")), cp += 2;
  927.       else if (letter(cp[1])) {
  928.           char *save = cp;
  929. --- 884,894 ----
  930.       }
  931.   
  932.       dp = NULL;    /* no output substitution */
  933. !     if (cp[1] == 0 || ISDIRSEP(cp[1]) || cp[1] == ':') /* ~ or ~/ */
  934.           dp = strval(global("HOME")), cp += 1;
  935. !     else if (cp[1] == '+' && (ISDIRSEP(cp[2]) || cp[2] == ':' || cp[2] == 0))
  936.           dp = strval(global("PWD")), cp += 2;
  937. !     else if (cp[1] == '-' && (ISDIRSEP(cp[2]) || cp[2] == ':' || cp[2] == 0))
  938.           dp = strval(global("OLDPWD")), cp += 2;
  939.       else if (letter(cp[1])) {
  940.           char *save = cp;
  941. ***************
  942. *** 914,919 ****
  943. --- 918,926 ----
  944.   homedir(name)
  945.       char *name;
  946.   {
  947. + #ifdef OS2
  948. +         return getenv("HOME");
  949. + #else
  950.       register struct tbl *ap;
  951.       register struct passwd *pw;
  952.       extern struct passwd *getpwnam();
  953. ***************
  954. *** 925,928 ****
  955. --- 932,936 ----
  956.       if (pw == NULL)
  957.           return NULL;
  958.       return pw->pw_dir;
  959. + #endif
  960.   }
  961. diff -cbr orig/sh/exec.c new/sh/exec.c
  962. *** orig/sh/exec.c    Tue Aug 25 15:20:12 1992
  963. --- new/sh/exec.c    Mon Sep 21 10:35:07 1992
  964. ***************
  965. *** 10,15 ****
  966. --- 10,18 ----
  967.   #include <errno.h>
  968.   #include <signal.h>
  969.   #include <setjmp.h>
  970. + #ifdef OS2
  971. + #include <process.h>
  972. + #endif
  973.   #include <unistd.h>
  974.   #include <fcntl.h>
  975.   #include <sys/stat.h>
  976. ***************
  977. *** 241,247 ****
  978.               clexec_tab[i] = 0;
  979.             }
  980.   #endif
  981. !         execve(t->str, t->args, ap);
  982.           if (errno == ENOEXEC) {
  983.               char *shell;
  984.   #ifdef    SHARPBANG
  985. --- 244,250 ----
  986.               clexec_tab[i] = 0;
  987.             }
  988.   #endif
  989. !         _execve(t->str, t->args, ap);
  990.           if (errno == ENOEXEC) {
  991.               char *shell;
  992.   #ifdef    SHARPBANG
  993. ***************
  994. *** 256,263 ****
  995.               }
  996.               *t->args-- = t->str;
  997.               *t->args = shell;
  998. !             execve(t->args[0], t->args, ap);
  999. !             errorf("No shell\n");
  1000.   #endif    /* SHARPBANG */
  1001.           }
  1002.           errorf("%s: %s\n", s, strerror(errno));
  1003. --- 259,266 ----
  1004.               }
  1005.               *t->args-- = t->str;
  1006.               *t->args = shell;
  1007. !             _execve(t->args[0], t->args, ap);
  1008. !             errorf("Cannot execute.\n");
  1009.   #endif    /* SHARPBANG */
  1010.           }
  1011.           errorf("%s: %s\n", s, strerror(errno));
  1012. ***************
  1013. *** 264,270 ****
  1014.       }
  1015.   
  1016.       quitenv();        /* restores IO */
  1017. !     if (e.interactive) {    /* flush stdout, shlout */
  1018.           fflush(shf[1]);
  1019.           fflush(shf[2]);
  1020.       }
  1021. --- 267,273 ----
  1022.       }
  1023.   
  1024.       quitenv();        /* restores IO */
  1025. !     if (e.interactive) {    /* fflush stdout, shlout */
  1026.           fflush(shf[1]);
  1027.           fflush(shf[2]);
  1028.       }
  1029. ***************
  1030. *** 425,431 ****
  1031.       register int fd, n;
  1032.       char *shell;
  1033.   
  1034. !     shell = strval(global("EXECSHELL"));
  1035.       if (shell && *shell) {
  1036.           if ((shell = search(shell,path,1)) == NULL)
  1037.               shell = SHELL;
  1038. --- 428,434 ----
  1039.       register int fd, n;
  1040.       char *shell;
  1041.   
  1042. !     shell = strval(global("COMSPEC"));
  1043.       if (shell && *shell) {
  1044.           if ((shell = search(shell,path,1)) == NULL)
  1045.               shell = SHELL;
  1046. ***************
  1047. *** 440,447 ****
  1048.               line[n] = '\0';
  1049.           (void) close(fd);
  1050.       }
  1051. !     if (line[0] == '#' && line[1] == '!') {
  1052. !         cp = &line[2];
  1053.           while (*cp && (*cp == ' ' || *cp == '\t'))
  1054.               cp++;
  1055.           if (*cp && *cp != '\n') {
  1056. --- 443,451 ----
  1057.               line[n] = '\0';
  1058.           (void) close(fd);
  1059.       }
  1060. !     if ((line[0] == '#' && line[1] == '!') || 
  1061. !         strnicmp(line, "extproc", 7) == 0) {
  1062. !         cp = line + (line[0] == '#' ? 2 : 7);
  1063.           while (*cp && (*cp == ' ' || *cp == '\t'))
  1064.               cp++;
  1065.           if (*cp && *cp != '\n') {
  1066. ***************
  1067. *** 462,474 ****
  1068.                   }
  1069.               }
  1070.               *cp = '\0';
  1071. !         } else
  1072.               *tp->args = shell;
  1073. !     } else
  1074.           *tp->args = shell;
  1075.   
  1076. !     (void) execve(tp->args[0], tp->args, ap);
  1077. !     errorf( "No shell\n" );
  1078.   }
  1079.   #endif    /* SHARPBANG */
  1080.   
  1081. --- 466,482 ----
  1082.                   }
  1083.               }
  1084.               *cp = '\0';
  1085. !         } else {
  1086. !                 *tp->args-- = "/c";
  1087.               *tp->args = shell;
  1088. !             }
  1089. !     } else {
  1090. !         *tp->args-- = "/c";
  1091.           *tp->args = shell;
  1092. +     }
  1093.   
  1094. !     (void) _execve(tp->args[0], tp->args, ap);
  1095. !     errorf( "Cannot execute.\n" );
  1096.   }
  1097.   #endif    /* SHARPBANG */
  1098.   
  1099. ***************
  1100. *** 557,563 ****
  1101.       register struct    tbl *tp = NULL;
  1102.       static struct tbl temp;
  1103.   
  1104. !     if (strchr(name, '/') != NULL) {
  1105.           tp = &temp;
  1106.           tp->type = CEXEC;
  1107.           tp->flag = 0;    /* make ~ISSET */
  1108. --- 565,571 ----
  1109.       register struct    tbl *tp = NULL;
  1110.       static struct tbl temp;
  1111.   
  1112. !     if (index_sep(name) != NULL) {
  1113.           tp = &temp;
  1114.           tp->type = CEXEC;
  1115.           tp->flag = 0;    /* make ~ISSET */
  1116. ***************
  1117. *** 610,616 ****
  1118.       register struct tbl *tp;
  1119.   
  1120.       for (twalk(&commands); (tp = tnext()) != NULL; )
  1121. !         if ((tp->flag&ISSET) && (all || tp->val.s[0] != '/')) {
  1122.               if ((tp->flag&ALLOC))
  1123.                   afree(tp->val.s, commands.areap);
  1124.               tp->flag = DEFINED; /* make ~ISSET */
  1125. --- 618,624 ----
  1126.       register struct tbl *tp;
  1127.   
  1128.       for (twalk(&commands); (tp = tnext()) != NULL; )
  1129. !         if ((tp->flag&ISSET) && (all || !ISDIRSEP(tp->val.s[0]))) {
  1130.               if ((tp->flag&ALLOC))
  1131.                   afree(tp->val.s, commands.areap);
  1132.               tp->flag = DEFINED; /* make ~ISSET */
  1133. ***************
  1134. *** 617,622 ****
  1135. --- 625,671 ----
  1136.           }
  1137.   }
  1138.   
  1139. + #ifdef OS2
  1140. + int eaccess2(char *path, int mode)
  1141. + {
  1142. +   struct stat s;
  1143. +   int i = access(path, mode);
  1144. +   if (i == 0 && mode == 1 && stat(path,&s) == 0 &&
  1145. +       ((s.st_mode & S_IFMT) != S_IFREG || (s.st_mode & S_IEXEC) == 0))
  1146. +     return -1;
  1147. +   else
  1148. +     return i;
  1149. + }
  1150. + int eaccess1(char *path, int mode)
  1151. + {
  1152. +         char *tp = path + strlen(path);
  1153. +         int i;
  1154. +         if ( i = eaccess2(path, mode) )
  1155. +         {
  1156. +             strcpy(tp, ".exe");
  1157. +             if ( i = eaccess2(path, mode) )
  1158. +             {
  1159. +                     strcpy(tp, ".com");
  1160. +                 if ( i = eaccess2(path, mode) )
  1161. +                     {
  1162. +                 strcpy(tp, ".ksh");
  1163. +                 if ( i = access(path, 0) )
  1164. +                 {
  1165. +                               strcpy(tp, ".cmd");
  1166. +                     if ( i = eaccess2(path, mode) )
  1167. +                             *tp = 0;
  1168. +                 }
  1169. +                     }
  1170. +               }
  1171. +         }
  1172. +         return i;
  1173. + }
  1174. + #endif
  1175.   /*
  1176.    * search for command with PATH
  1177.    */
  1178. ***************
  1179. *** 628,650 ****
  1180.       register int i;
  1181.       register char *sp, *tp;
  1182.       struct stat buf;
  1183.   
  1184. !     if (strchr(name, '/'))
  1185.           return (eaccess(name, mode) == 0) ? name : NULL;
  1186.   
  1187.       sp = path;
  1188.       while (sp != NULL) {
  1189.           tp = line;
  1190.           for (; *sp != '\0'; tp++)
  1191.               if ((*tp = *sp++) == ':') {
  1192.                   --sp;
  1193.                   break;
  1194.               }
  1195.           if (tp != line)
  1196. !             *tp++ = '/';
  1197.           for (i = 0; (*tp++ = name[i++]) != '\0';)
  1198.               ;
  1199. !         i = eaccess(line, mode);
  1200.           if (i == 0 && (mode != 1 || (stat(line,&buf) == 0 &&
  1201.               (buf.st_mode & S_IFMT) == S_IFREG)))
  1202.               return line;
  1203. --- 677,714 ----
  1204.       register int i;
  1205.       register char *sp, *tp;
  1206.       struct stat buf;
  1207. + #ifdef OS2
  1208. +     static char real[LINE + 1];
  1209. +     strcpy(line, name);
  1210. +     if (eaccess1(line, mode) == 0) 
  1211. +       return line;
  1212.   
  1213. !     if (index_sep(name))
  1214. !         return (eaccess1(line, mode) == 0) ? line : NULL;
  1215. ! #else
  1216. !     if (index_sep(name))
  1217.           return (eaccess(name, mode) == 0) ? name : NULL;
  1218. + #endif
  1219.   
  1220.       sp = path;
  1221.       while (sp != NULL) {
  1222.           tp = line;
  1223.           for (; *sp != '\0'; tp++)
  1224. + #ifdef OS2
  1225. +             if ((*tp = *sp++) == ';') {
  1226. + #else
  1227.               if ((*tp = *sp++) == ':') {
  1228. + #endif
  1229.                   --sp;
  1230.                   break;
  1231.               }
  1232.           if (tp != line)
  1233. !             *tp++ = DIRSEP;
  1234.           for (i = 0; (*tp++ = name[i++]) != '\0';)
  1235.               ;
  1236. !         i = eaccess1(line, mode);
  1237.           if (i == 0 && (mode != 1 || (stat(line,&buf) == 0 &&
  1238.               (buf.st_mode & S_IFMT) == S_IFREG)))
  1239.               return line;
  1240. ***************
  1241. *** 790,795 ****
  1242. --- 854,860 ----
  1243.       while (*ap != NULL)
  1244.           shellf(" %s", *ap++);
  1245.       shellf("\n");
  1246. +     fflush(shlout);
  1247.   }
  1248.   
  1249.   /*
  1250. diff -cbr orig/sh/expr.c new/sh/expr.c
  1251. *** orig/sh/expr.c    Sun May 03 18:45:06 1992
  1252. --- new/sh/expr.c    Sun May 03 19:41:24 1992
  1253. ***************
  1254. *** 20,27 ****
  1255.   #define    LLE    0x05
  1256.   #define    LGE    0x06
  1257.   
  1258. ! static const char *expression;    /* expression being evaluated */
  1259. ! static const char *tokp;    /* lexical position */
  1260.   static int tok;            /* token from token() */
  1261.   static struct tbl *val;        /* value from token() */
  1262.   
  1263. --- 20,27 ----
  1264.   #define    LLE    0x05
  1265.   #define    LGE    0x06
  1266.   
  1267. ! static char *expression;    /* expression being evaluated */
  1268. ! static char *tokp;    /* lexical position */
  1269.   static int tok;            /* token from token() */
  1270.   static struct tbl *val;        /* value from token() */
  1271.   
  1272. ***************
  1273. *** 51,57 ****
  1274.   {
  1275.       struct tbl *v;
  1276.   
  1277. !     expression = tokp = expr;
  1278.       token();
  1279.       v = intvar(asn());
  1280.       if (!(tok == 0))
  1281. --- 51,57 ----
  1282.   {
  1283.       struct tbl *v;
  1284.   
  1285. !     expression = tokp = (char *) expr;
  1286.       token();
  1287.       v = intvar(asn());
  1288.       if (!(tok == 0))
  1289. diff -cbr orig/sh/history.c new/sh/history.c
  1290. *** orig/sh/history.c    Tue Aug 25 15:21:06 1992
  1291. --- new/sh/history.c    Sun Sep 06 20:14:20 1992
  1292. ***************
  1293. *** 18,23 ****
  1294. --- 18,31 ----
  1295.    *        to work on your system
  1296.    */
  1297.   
  1298. + #ifndef HISTFILE
  1299. + # ifdef OS2
  1300. + #  define HISTFILE "history.ksh"
  1301. + # else
  1302. + #  define HISTFILE ".pdksh_hist"
  1303. + # endif
  1304. + #endif
  1305.   #include "config.h"
  1306.   #include "stdh.h"
  1307.   
  1308. ***************
  1309. *** 29,37 ****
  1310.   
  1311.   static FILE *hist_fh = NULL;
  1312.   static FILE *hist_open ARGS((char *mode));
  1313. - #ifndef HISTFILE
  1314. - # define HISTFILE ".pdksh_hist"
  1315. - #endif
  1316.   
  1317.   #else
  1318.   /*    Defines and includes for the complicated case */
  1319. --- 37,42 ----
  1320. diff -cbr orig/sh/io.c new/sh/io.c
  1321. *** orig/sh/io.c    Tue Aug 25 15:20:17 1992
  1322. --- new/sh/io.c    Tue Sep 08 12:36:07 1992
  1323. ***************
  1324. *** 99,104 ****
  1325. --- 99,107 ----
  1326.       if (shf[fd] != NULL)
  1327.           return;
  1328.       if (fd <= 2)
  1329. + #ifdef __EMX__
  1330. +         /* ??? _streamv[fd].flags = 0; /* re-use stdin, stdout, stderr */
  1331. + #else
  1332.   #ifndef _BSDI
  1333.   #ifdef _MINIX
  1334.           /* ? */;
  1335. ***************
  1336. *** 109,114 ****
  1337. --- 112,118 ----
  1338.           /* Chris Torek's stdio replacement */
  1339.           __sF[fd]._flags = 0;
  1340.   #endif
  1341. + #endif
  1342.       shf[fd] = fdopen(fd, "r+");
  1343.       if (shf[fd] == NULL)
  1344.           return;
  1345. ***************
  1346. *** 141,147 ****
  1347. --- 145,155 ----
  1348.   
  1349.       if (fd < FDBASE) {
  1350.           flushshf(fd);
  1351. + #ifdef OS2
  1352. +         nfd = getdup(fd, FDBASE);
  1353. + #else
  1354.           nfd = fcntl(fd, F_DUPFD, FDBASE);
  1355. + #endif
  1356.           if (nfd < 0)
  1357.               if (errno == EBADF)
  1358.                   return -1;
  1359. ***************
  1360. *** 150,156 ****
  1361.   #ifdef F_SETFD
  1362.           (void) fcntl(nfd, F_SETFD, 1);
  1363.   #else
  1364. !         (void) fd_clexec(ttyfd);
  1365.   #endif
  1366.           close(fd);
  1367.       } else
  1368. --- 158,164 ----
  1369.   #ifdef F_SETFD
  1370.           (void) fcntl(nfd, F_SETFD, 1);
  1371.   #else
  1372. !         (void) fd_clexec(nfd);
  1373.   #endif
  1374.           close(fd);
  1375.       } else
  1376. ***************
  1377. *** 168,174 ****
  1378. --- 176,186 ----
  1379.       close(fd);
  1380.       if (ofd < 0)        /* original fd closed */
  1381.           return;
  1382. + #ifdef OS2
  1383. +         dup2(ofd, fd);
  1384. + #else
  1385.       (void) fcntl(ofd, F_DUPFD, fd);
  1386. + #endif
  1387.       close(ofd);
  1388.   }
  1389.   
  1390. ***************
  1391. *** 202,210 ****
  1392. --- 214,229 ----
  1393.       static unsigned int inc = 0;
  1394.       char path [PATH];
  1395.   
  1396. + #ifdef OS2
  1397. +         extern char *getenv();
  1398. +         char *tmp = getenv("TMP");
  1399. +         sprintf(path, "%s/shXXXXXX", tmp ? tmp : "");
  1400. +         mktemp(path);
  1401. + #else
  1402.       sprintf(path, "/tmp/sh%05u%02u", (unsigned)getpid(), inc++);
  1403.   #if defined(_SYSV) || defined(_BSD)
  1404.       close(creat(path, 0600));    /* to get appropriate permissions */
  1405. + #endif
  1406.   #endif
  1407.       tp = (struct temp *) alloc(sizeof(struct temp), ap);
  1408.       tp->next = NULL;
  1409. diff -cbr orig/sh/jobs.c new/sh/jobs.c
  1410. *** orig/sh/jobs.c    Tue Aug 25 15:20:17 1992
  1411. --- new/sh/jobs.c    Sun Sep 06 20:16:02 1992
  1412. ***************
  1413. *** 18,28 ****
  1414.   
  1415.   #include "stdh.h"
  1416.   #include <errno.h>
  1417. - #include <unistd.h>
  1418.   #include <signal.h>
  1419.   #include <setjmp.h>
  1420.   #include <sys/times.h>
  1421.   #include <sys/wait.h>
  1422.   #include "sh.h"
  1423.   #ifdef JOBS
  1424.   #ifdef _BSDI
  1425. --- 18,35 ----
  1426.   
  1427.   #include "stdh.h"
  1428.   #include <errno.h>
  1429.   #include <signal.h>
  1430.   #include <setjmp.h>
  1431. + #ifdef OS2
  1432. + #include <time.h>
  1433. + #include <process.h>
  1434. + typedef int pid_t;
  1435. + #endif
  1436. + #include <unistd.h>
  1437.   #include <sys/times.h>
  1438. + #ifndef OS2
  1439.   #include <sys/wait.h>
  1440. + #endif
  1441.   #include "sh.h"
  1442.   #ifdef JOBS
  1443.   #ifdef _BSDI
  1444. ***************
  1445. *** 32,40 ****
  1446. --- 39,49 ----
  1447.   #ifdef _BSD
  1448.   #include <sys/ioctl.h>
  1449.   #else
  1450. + #ifndef OS2
  1451.   #include "termios.h"
  1452.   #endif
  1453.   #endif
  1454. + #endif
  1455.   
  1456.   #ifdef _BSD
  1457.   /*
  1458. ***************
  1459. *** 68,76 ****
  1460. --- 77,103 ----
  1461.   #   define    waitpid(pid, sp, opts)    wait3(sp, opts, (void*)NULL)
  1462.   # endif
  1463.   #else                    /* not _BSD */
  1464. + # ifndef WIFSTOPPED
  1465. + #   define WIFSTOPPED(x)   (((x)&0xFF) == 0x7F)
  1466. + # endif
  1467. + # ifndef WIFSIGNALED
  1468. + #   define WIFSIGNALED(x)  (((x)&0xFF) != 0x7F && ((x)&0x7F) != 0)
  1469. + # endif
  1470. + # ifndef WIFEXITED
  1471. + #   define WIFEXITED(x)    (((x)&0xFF) != 0x7F && ((x)&0x7F) == 0)
  1472. + # endif
  1473.   # ifndef WIFCORED
  1474.   #   define    WIFCORED(x)    (!!((x)&0x80)) /* non-standard */
  1475.   # endif
  1476. + # ifndef WEXITSTATUS
  1477. + #   define WEXITSTATUS(x)  ((x)>>8&0xFF)
  1478. + # endif
  1479. + # ifndef WTERMSIG
  1480. + #   define WTERMSIG(x)     ((x)&0x7F)
  1481. + # endif
  1482. + # ifndef WSTOPSIG
  1483. + #   define WSTOPSIG(x)     ((x)>>8&0xFF)
  1484. + # endif
  1485.   #endif
  1486.   
  1487.   /* as of P1003.1 Draft 12.3:
  1488. ***************
  1489. *** 325,331 ****
  1490.   #ifdef JOBS
  1491.       /* don't allow SIGCHLD until we are ready */
  1492.   
  1493. ! #ifdef USE_SIGACT
  1494.       sigprocmask(SIG_SETMASK, &sm_sigchld, NULL);
  1495.   # else
  1496.       sigsetmask(sm_sigchld);
  1497. --- 352,358 ----
  1498.   #ifdef JOBS
  1499.       /* don't allow SIGCHLD until we are ready */
  1500.   
  1501. ! # ifdef USE_SIGACT
  1502.       sigprocmask(SIG_SETMASK, &sm_sigchld, NULL);
  1503.   # else
  1504.       sigsetmask(sm_sigchld);
  1505. diff -cbr orig/sh/lex.c new/sh/lex.c
  1506. *** orig/sh/lex.c    Tue Aug 25 15:20:17 1992
  1507. --- new/sh/lex.c    Tue Sep 01 08:41:20 1992
  1508. ***************
  1509. *** 9,15 ****
  1510. --- 9,17 ----
  1511.   #include "stdh.h"
  1512.   #include <errno.h>
  1513.   #include <setjmp.h>
  1514. + #ifndef OS2
  1515.   #include <unistd.h>
  1516. + #endif
  1517.   #include <assert.h>
  1518.   #include "sh.h"
  1519.   #include "expand.h"
  1520. ***************
  1521. *** 78,84 ****
  1522.           if (c == '#')
  1523.               while ((c = getsc()) != 0 && c != '\n')
  1524.                   ;
  1525. !         ungetsc();
  1526.       }
  1527.       if (alias) {            /* trailing ' ' in alias definition */
  1528.           alias = 0;
  1529. --- 80,86 ----
  1530.           if (c == '#')
  1531.               while ((c = getsc()) != 0 && c != '\n')
  1532.                   ;
  1533. !                 if (c) ungetsc();
  1534.       }
  1535.       if (alias) {            /* trailing ' ' in alias definition */
  1536.           alias = 0;
  1537. ***************
  1538. *** 95,103 ****
  1539.               switch (c) {
  1540.                 case '\\':
  1541.                   c = getsc();
  1542. !                 if (c != '\n')
  1543.                       *wp++ = QCHAR, *wp++ = c;
  1544. !                 else
  1545.                       if (wp == Xstring(ws, wp))
  1546.                           goto Again;
  1547.                   break;
  1548. --- 97,111 ----
  1549.               switch (c) {
  1550.                 case '\\':
  1551.                   c = getsc();
  1552. !                 if (c != '\n') {
  1553. ! #ifdef OS2
  1554. !                                         if ( isalnum(c) ) {
  1555. !                        *wp++ = CHAR, *wp++ = '\\';
  1556. !                        *wp++ = CHAR, *wp++ = c;
  1557. !                                         } else
  1558. ! #endif
  1559.                       *wp++ = QCHAR, *wp++ = c;
  1560. !                 } else
  1561.                       if (wp == Xstring(ws, wp))
  1562.                           goto Again;
  1563.                   break;
  1564. ***************
  1565. *** 647,652 ****
  1566. --- 655,661 ----
  1567.   pprompt(cp)
  1568.       register char *cp;
  1569.   {
  1570. +         putc('\r', shlout);
  1571.       while (*cp != 0)
  1572.           if (*cp != '!')
  1573.               putc(*cp++, shlout);
  1574. ***************
  1575. *** 654,659 ****
  1576. --- 663,674 ----
  1577.               if (*++cp == '!')
  1578.                   putc(*cp++, shlout);
  1579.               else
  1580. +                                 if (*cp == '.')
  1581. +                                 {
  1582. +                                     shellf("%s", strval(global("PWD")));
  1583. +                                         cp++;
  1584. +                                 }
  1585. +                                 else
  1586.                   shellf("%d", source->line);
  1587.       fflush(shlout);
  1588.   }
  1589. diff -cbr orig/sh/mail.c new/sh/mail.c
  1590. *** orig/sh/mail.c    Sun May 03 18:45:09 1992
  1591. --- new/sh/mail.c    Tue Sep 01 09:14:16 1992
  1592. ***************
  1593. *** 120,126 ****
  1594.       mval = strsave(mptoparse, APERM);
  1595.       while (mval) {
  1596.           mpath = mval;
  1597. !         if ((mval = strchr(mval, ':')) != NULL) {
  1598.               *mval ='\0', mval++;
  1599.           }
  1600.           if ((mmsg = strchr(mpath, '?')) != NULL) {
  1601. --- 120,126 ----
  1602.       mval = strsave(mptoparse, APERM);
  1603.       while (mval) {
  1604.           mpath = mval;
  1605. !         if ((mval = strchr(mval, PATHSEP)) != NULL) {
  1606.               *mval ='\0', mval++;
  1607.           }
  1608.           if ((mmsg = strchr(mpath, '?')) != NULL) {
  1609. diff -cbr orig/sh/main.c new/sh/main.c
  1610. *** orig/sh/main.c    Tue Aug 25 15:21:06 1992
  1611. --- new/sh/main.c    Sat Sep 26 13:07:12 1992
  1612. ***************
  1613. *** 9,15 ****
  1614. --- 9,17 ----
  1615.   #define    EXTERN                /* define EXTERNs in sh.h */
  1616.   
  1617.   #include "stdh.h"
  1618. + #ifndef OS2
  1619.   #include <unistd.h>
  1620. + #endif
  1621.   #include <fcntl.h>
  1622.   #include <signal.h>
  1623.   #include <errno.h>
  1624. ***************
  1625. *** 28,33 ****
  1626. --- 30,40 ----
  1627.   Area    aperm;
  1628.   
  1629.   static    void    reclaim ARGS((void));
  1630. + static    int    loginshell;
  1631. + #ifdef EDIT
  1632. + void x_init();
  1633. + #endif
  1634.   
  1635.   /*
  1636.    * shell initialization
  1637. ***************
  1638. *** 208,213 ****
  1639. --- 215,224 ----
  1640.                       }
  1641.                       break;
  1642.   
  1643. +                                   case '0':
  1644. +                                         name = "-ksh";
  1645. +                                         break;
  1646.                     case 'q':
  1647.                       qflag = 1;
  1648.                       break;
  1649. ***************
  1650. *** 219,225 ****
  1651.               }
  1652.           }
  1653.           if (s->type == SFILE && argi < argc && !flag[FSTDIN]) {
  1654. !             s->file = name = argv[argi++];
  1655.               if ((s->u.file = fopen(name, "r")) == NULL)
  1656.                   errorf("%s: cannot open\n", name);
  1657.               fflag = 1;
  1658. --- 230,236 ----
  1659.               }
  1660.           }
  1661.           if (s->type == SFILE && argi < argc && !flag[FSTDIN]) {
  1662. !             s->file = name = argv[argi];
  1663.               if ((s->u.file = fopen(name, "r")) == NULL)
  1664.                   errorf("%s: cannot open\n", name);
  1665.               fflag = 1;
  1666. ***************
  1667. *** 237,243 ****
  1668. --- 248,258 ----
  1669.               s->type = STTY;
  1670.       }
  1671.       if (s->type == STTY) {
  1672. + #ifdef OS2
  1673. +             ttyfd = getdup(0, FDBASE);
  1674. + #else
  1675.           ttyfd = fcntl(0, F_DUPFD, FDBASE);
  1676. + #endif
  1677.   #ifdef F_SETFD
  1678.           (void) fcntl(ttyfd, F_SETFD, 1);
  1679.   #else
  1680. ***************
  1681. *** 251,258 ****
  1682. --- 266,275 ----
  1683.       /* initialize job control */
  1684.       j_init();
  1685.   
  1686. + #ifndef OS2
  1687.       if (!qflag)
  1688.           ignoresig(SIGQUIT);
  1689. + #endif
  1690.   
  1691.       l->argv = &argv[argi];
  1692.       l->argc = argc - argi;
  1693. ***************
  1694. *** 260,270 ****
  1695. --- 277,302 ----
  1696.       resetopts();
  1697.   
  1698.       if (name[0] == '-') {
  1699. +         loginshell = 1;
  1700.           flag[FTALKING] = 1;
  1701. + #ifdef OS2
  1702. +         arg = substitute("$INIT/profile.ksh", 0);
  1703. +         (void) include(*arg ? arg : "/etc/profile.ksh");
  1704. +                 (void) include("profile.ksh");
  1705. + #else
  1706.           (void) include("/etc/profile");
  1707.           (void) include(".profile");
  1708. + #endif
  1709.       }
  1710.   
  1711. + #ifdef OS2
  1712. +     arg = substitute("~/kshrc.ksh", DOTILDE);
  1713. + #else
  1714. +     arg = substitute("~/.kshrc", DOTILDE);
  1715. + #endif
  1716. +     if (*arg != '\0')
  1717. +         (void) include(arg);
  1718.       /* include $ENV */
  1719.       arg = substitute(strval(global("ENV")), DOTILDE);
  1720.       if (*arg != '\0')
  1721. ***************
  1722. *** 410,415 ****
  1723. --- 442,449 ----
  1724.   leave(rv)
  1725.       int rv;
  1726.   {
  1727. +     char *arg;
  1728.       if (e.type == E_TCOM && e.oenv != NULL)    /* exec'd command */
  1729.           unwind();
  1730.       runtrap(&sigtraps[0]);
  1731. ***************
  1732. *** 418,423 ****
  1733. --- 452,467 ----
  1734.         hist_finish();
  1735.       }
  1736.       j_exit();
  1737. +     if ( loginshell )
  1738. +     {
  1739. + #ifdef OS2
  1740. +         arg = substitute("~/kshexit.ksh", DOTILDE);
  1741. + #else
  1742. +         arg = substitute("~/.kshexit", DOTILDE);
  1743. + #endif
  1744. +         if (*arg != '\0')
  1745. +             (void) include(arg);
  1746. +     }
  1747.       exit(rv);
  1748.       /* NOTREACHED */
  1749.   }
  1750. diff -cbr orig/sh/misc.c new/sh/misc.c
  1751. *** orig/sh/misc.c    Tue Aug 25 15:21:06 1992
  1752. --- new/sh/misc.c    Tue Sep 08 11:18:07 1992
  1753. ***************
  1754. *** 214,220 ****
  1755.    * pattern character are prefixed with MAGIC by expand.
  1756.    */
  1757.   
  1758. ! static    char    *cclass ARGS((char *, int c));
  1759.   
  1760.   int
  1761.   gmatch(s, p)
  1762. --- 214,220 ----
  1763.    * pattern character are prefixed with MAGIC by expand.
  1764.    */
  1765.   
  1766. ! static    char    *cclass ARGS((char *, int));
  1767.   
  1768.   int
  1769.   gmatch(s, p)
  1770. ***************
  1771. *** 295,301 ****
  1772.   qsortp(base, n, f)
  1773.       void **base;        /* base address */
  1774.       size_t n;        /* elements */
  1775. !     int (*f)();        /* compare function */
  1776.   {
  1777.       qsort1(base, base + n, f);
  1778.   }
  1779. --- 295,301 ----
  1780.   qsortp(base, n, f)
  1781.       void **base;        /* base address */
  1782.       size_t n;        /* elements */
  1783. !         int (*f)(void *, void *); /* compare function */
  1784.   {
  1785.       qsort1(base, base + n, f);
  1786.   }
  1787. ***************
  1788. *** 307,312 ****
  1789. --- 307,313 ----
  1790.       register void *t; t = *(a); *(a) = *(c); *(c) = *(b); *(b) = t;\
  1791.   }
  1792.   
  1793. + void
  1794.   qsort1(base, lim, f)
  1795.       void **base, **lim;
  1796.       int (*f)();
  1797. ***************
  1798. *** 388,403 ****
  1799.   cleanpath(pwd, dir, clean)
  1800.       char *pwd, *dir, *clean;
  1801.   {
  1802. !     register char  *s, *d, *p;
  1803. !     char *slash = "/";
  1804.       register int inslash = 0;
  1805.   
  1806.       d = clean;
  1807. !     if (*dir != '/') {
  1808.           s = pwd;
  1809.           while (*d++ = *s++)
  1810.               ;
  1811. !         if (d >= clean + 2 && *(d - 2) == '/')
  1812.               d--;
  1813.           else
  1814.               *(d - 1) = '/';
  1815. --- 389,408 ----
  1816.   cleanpath(pwd, dir, clean)
  1817.       char *pwd, *dir, *clean;
  1818.   {
  1819. !     register char  *s, *d, *p, c;
  1820. !     char *slash = DIRSEPSTR;
  1821.       register int inslash = 0;
  1822.   
  1823.       d = clean;
  1824. ! #ifdef OS2
  1825. !     if (!ISDIRSEP(*dir) && !(isalpha(dir[0]) && dir[1] == ':')) {
  1826. ! #else
  1827. !     if (!ISDIRSEP(*dir)) {
  1828. ! #endif
  1829.           s = pwd;
  1830.           while (*d++ = *s++)
  1831.               ;
  1832. !         if (d >= clean + 2 && ISDIRSEP(*(d - 2)))
  1833.               d--;
  1834.           else
  1835.               *(d - 1) = '/';
  1836. ***************
  1837. *** 405,430 ****
  1838.   
  1839.       s = dir;
  1840.       while (*s) {
  1841. !         if ((*d++ = *s++) == '/' && d > clean + 1) {
  1842. !             if (*(p = d - 2) == '/') {
  1843.                   --d;
  1844.               } else if (*p == '.') {
  1845. !                 if (*--p == '/') {
  1846.                       d -= 2;
  1847. !                 } else if (*p == '.' && *--p == '/') {
  1848. !                     while (p > clean && *--p != '/')
  1849.                           ;
  1850.                       d = p + 1;
  1851.                   }
  1852.               }
  1853.           }
  1854. !         if (!*s && !inslash && *(s - 1) != '/') {
  1855.               inslash = 1;
  1856.               s = slash;
  1857.           }
  1858.       }
  1859.   
  1860. !     if (*(d - 1) == '/' && (d - 1) > clean)
  1861.           d--;
  1862.       *d = '\0';
  1863.   }
  1864. --- 410,442 ----
  1865.   
  1866.       s = dir;
  1867.       while (*s) {
  1868. !                 c = (*d++ = *s++);
  1869. !         if (ISDIRSEP(c) && d > clean + 1) {
  1870. !                         p = d - 2;
  1871. !             if (ISDIRSEP(*p)) {
  1872.                   --d;
  1873.               } else if (*p == '.') {
  1874. !                                 p--;
  1875. !                 if (ISDIRSEP(*p)) {
  1876.                       d -= 2;
  1877. !                 } else if (*p == '.' && --p && ISDIRSEP(*p)) {
  1878. !                     while (p > clean && --p && 
  1879. !                            !ISDIRSEP(*p))
  1880.                           ;
  1881.                       d = p + 1;
  1882.                   }
  1883.               }
  1884.           }
  1885. !         if (!*s && !inslash && !ISDIRSEP(*(s - 1))) {
  1886.               inslash = 1;
  1887.               s = slash;
  1888.           }
  1889.       }
  1890.   
  1891. !     if (ISDIRSEP(*(d - 1)) && (d - 1) > clean)
  1892. ! #ifdef OS2
  1893. !         if (*(d - 2) != ':')
  1894. ! #endif
  1895.           d--;
  1896.       *d = '\0';
  1897.   }
  1898. diff -cbr orig/sh/proto.h new/sh/proto.h
  1899. *** orig/sh/proto.h    Tue Aug 25 15:20:18 1992
  1900. --- new/sh/proto.h    Tue Aug 25 15:23:10 1992
  1901. ***************
  1902. *** 180,187 ****
  1903.   int     getn         ARGS((char *as));
  1904.   char *    strerror     ARGS((int i));
  1905.   int     gmatch         ARGS((char *s, char *p));
  1906. ! void     qsortp         ARGS((void **base, size_t n, int (*f)()));
  1907. ! int     qsort1         ARGS((void **base, void **lim, int (*f)()));
  1908.   int     xstrcmp         ARGS((void *p1, void *p2));
  1909.   void     cleanpath     ARGS((char *pwd, char *dir, char *clean));
  1910.   /* syn.c */
  1911. --- 180,187 ----
  1912.   int     getn         ARGS((char *as));
  1913.   char *    strerror     ARGS((int i));
  1914.   int     gmatch         ARGS((char *s, char *p));
  1915. ! void    qsortp          ARGS((void **base, size_t n, int (*compare)(void *, void *)));
  1916. ! void     qsort1         ARGS((void **base, void **lim, int (*f)()));
  1917.   int     xstrcmp         ARGS((void *p1, void *p2));
  1918.   void     cleanpath     ARGS((char *pwd, char *dir, char *clean));
  1919.   /* syn.c */
  1920. diff -cbr orig/sh/sh.h new/sh/sh.h
  1921. *** orig/sh/sh.h    Tue Aug 25 15:21:07 1992
  1922. --- new/sh/sh.h    Wed Sep 09 21:49:11 1992
  1923. ***************
  1924. *** 16,22 ****
  1925.   #endif
  1926.   
  1927.   #ifndef SHELL
  1928. ! #define    SHELL    "/bin/sh"    /* shell to exec scripts */
  1929.   #endif
  1930.   
  1931.   #ifdef _BSD
  1932. --- 16,22 ----
  1933.   #endif
  1934.   
  1935.   #ifndef SHELL
  1936. ! #define    SHELL    "cmd.exe"    /* shell to exec scripts */
  1937.   #endif
  1938.   
  1939.   #ifdef _BSD
  1940. ***************
  1941. *** 57,63 ****
  1942.   #define    FDBASE    10        /* First file usable by Shell */
  1943.   
  1944.   /* you're not going to run setuid shell scripts, are you? */
  1945. ! #define    eaccess(path, mode)    access(path, mode)
  1946.   
  1947.   #define    MAGIC    (char)0x80    /* prefix for ~*?[ during expand */
  1948.   #define    NOT    '!'    /* might use ^ */
  1949. --- 57,63 ----
  1950.   #define    FDBASE    10        /* First file usable by Shell */
  1951.   
  1952.   /* you're not going to run setuid shell scripts, are you? */
  1953. ! #define    eaccess(path, mode)    (path ? access(path, mode) : -1)
  1954.   
  1955.   #define    MAGIC    (char)0x80    /* prefix for ~*?[ during expand */
  1956.   #define    NOT    '!'    /* might use ^ */
  1957. ***************
  1958. *** 262,267 ****
  1959. --- 262,268 ----
  1960.   void    initctypes ARGS((void));
  1961.   void    setctypes ARGS((const char*, int type));
  1962.   #endif
  1963.   #define    ctype(c, t)    !!(ctypes[(unsigned char)(c)]&(t))
  1964.   #define    letter(c)    ctype(c, C_ALPHA)
  1965.   #define    digit(c)    ctype(c, C_DIGIT)
  1966. ***************
  1967. *** 272,277 ****
  1968. --- 273,282 ----
  1969.   #include "lex.h"
  1970.   #include "proto.h"
  1971.   
  1972. + #ifndef offsetof
  1973. + #define        offsetof(type,id) ((size_t)&((type*)NULL)->id)
  1974. + #endif
  1975.   /*
  1976.    * 91-07-06 <sjg@sun0>
  1977.    * use my simple debug tracing...
  1978. ***************
  1979. *** 279,285 ****
  1980.   #include "trace.h"
  1981.   
  1982.   #ifndef fileno
  1983. ! #define fileno(p)    ((p)->_file)
  1984.   #endif
  1985.   
  1986.   /* be sure not to interfere with anyone else's idea about EXTERN */
  1987. --- 284,290 ----
  1988.   #include "trace.h"
  1989.   
  1990.   #ifndef fileno
  1991. ! #define fileno(p)    ((p)->handle)
  1992.   #endif
  1993.   
  1994.   /* be sure not to interfere with anyone else's idea about EXTERN */
  1995. ***************
  1996. *** 294,296 ****
  1997. --- 299,319 ----
  1998.    * comment-column:40
  1999.    * End:
  2000.    */
  2001. + #ifdef OS2
  2002. + #define PATHSEP        ';'
  2003. + #define DIRSEP         '\\'
  2004. + #define DIRSEPSTR      "\\"
  2005. + #define ISDIRSEP(c)    ((c) == '\\' || (c) == '/')
  2006. + extern char *index_sep(char *path);
  2007. + extern char *rindex_sep(char *path);
  2008. + #define chdir          _chdir2
  2009. + #define getcwd         _getcwd2
  2010. + #else
  2011. + #define PATHSEP        ':'
  2012. + #define DIRSEP         '/'
  2013. + #define DIRSEPSTR      "/"
  2014. + #define ISDIRSEP(c)    ((c) == '/')
  2015. + #define index_sep(p)   strchr(p, DIRSEP)
  2016. + #define rindex_sep(p)  strrchr(p, DIRSEP)
  2017. + #endif
  2018. diff -cbr orig/sh/trap.c new/sh/trap.c
  2019. *** orig/sh/trap.c    Tue Aug 25 15:20:19 1992
  2020. --- new/sh/trap.c    Tue Aug 25 16:11:22 1992
  2021. ***************
  2022. *** 14,52 ****
  2023.   
  2024.   Trap sigtraps [SIGNALS] = {
  2025.       {0,    "EXIT", "Signal 0"}, /* todo: belongs in e.loc->exit */
  2026. -     {SIGHUP, "HUP", "Hangup"},
  2027.       {SIGINT, "INT", "Interrupt"},
  2028. -     {SIGQUIT, "QUIT", "Quit"},
  2029.       {SIGILL, "ILL", "Illegal instruction"},
  2030.       {SIGTRAP, "TRAP", "Trace trap"},
  2031.   #ifdef    SIGABRT
  2032. !     {SIGIOT, "ABRT", "Abort"},
  2033.   #else
  2034.       {SIGIOT, "IOT", "IOT instruction"},
  2035.   #endif
  2036.       {SIGEMT, "EMT", "EMT trap"},
  2037. -     {SIGFPE, "FPE", "Floating exception"},
  2038.       {SIGKILL, "KILL", "Killed"},
  2039.   #ifdef _MINIX
  2040.       {SIGUSR1, "USR1", "User defined signal 1"},
  2041. -     {SIGSEGV, "SEGV", "Memory fault"},
  2042.       {SIGUSR2, "USR2", "User defined signal 2"},
  2043.   #else
  2044.       {SIGBUS, "BUS", "Bus error"},
  2045. -     {SIGSEGV, "SEGV", "Memory fault"},
  2046.       {SIGSYS, "SYS", "Bad system call"},
  2047.   #endif
  2048.       {SIGPIPE, "PIPE", "Broken pipe"},
  2049.       {SIGALRM, "ALRM", "Alarm clock"},
  2050. -     {SIGTERM, "TERM", "Terminated"},
  2051. - #ifdef _MINIX
  2052. -     {SIGSTKFLT, "STKFLT", "Stack fault"},
  2053. - #endif
  2054.   #ifdef _SYSV
  2055.       {SIGUSR1, "USR1", "User defined signal 1"},
  2056.       {SIGUSR2, "USR2", "User defined signal 2"},
  2057. -     {SIGCLD, "CLD", "Death of a child"},
  2058.       {SIGPWR, "PWR", "Power-fail restart"},
  2059.   #ifdef JOBS            /* todo: need to be more portable */
  2060.       {SIGTSTP, "TSTP", "Stop"},
  2061.       {SIGTTIN, "TTIN", "Stop (tty input)"},
  2062. --- 14,54 ----
  2063.   
  2064.   Trap sigtraps [SIGNALS] = {
  2065.       {0,    "EXIT", "Signal 0"}, /* todo: belongs in e.loc->exit */
  2066.       {SIGINT, "INT", "Interrupt"},
  2067.       {SIGILL, "ILL", "Illegal instruction"},
  2068. +     {SIGFPE, "FPE", "Floating exception"},
  2069. +     {SIGSEGV, "SEGV", "Memory fault"},
  2070. +     {SIGTERM, "TERM", "Terminated"},
  2071. + #ifdef OS2
  2072. +     {SIGBREAK, "BREAK", "Ctrl-Break"},
  2073. + #endif
  2074. +     {SIGHUP, "HUP", "Hangup"},
  2075. +     {SIGQUIT, "QUIT", "Quit"},
  2076.       {SIGTRAP, "TRAP", "Trace trap"},
  2077.   #ifdef    SIGABRT
  2078. !     {SIGABRT, "ABRT", "Abort"},
  2079.   #else
  2080.       {SIGIOT, "IOT", "IOT instruction"},
  2081.   #endif
  2082.       {SIGEMT, "EMT", "EMT trap"},
  2083.       {SIGKILL, "KILL", "Killed"},
  2084.   #ifdef _MINIX
  2085.       {SIGUSR1, "USR1", "User defined signal 1"},
  2086.       {SIGUSR2, "USR2", "User defined signal 2"},
  2087. +     {SIGSTKFLT, "STKFLT", "Stack fault"},
  2088.   #else
  2089.       {SIGBUS, "BUS", "Bus error"},
  2090.       {SIGSYS, "SYS", "Bad system call"},
  2091.   #endif
  2092.       {SIGPIPE, "PIPE", "Broken pipe"},
  2093.       {SIGALRM, "ALRM", "Alarm clock"},
  2094.   #ifdef _SYSV
  2095. + #ifndef OS2
  2096.       {SIGUSR1, "USR1", "User defined signal 1"},
  2097.       {SIGUSR2, "USR2", "User defined signal 2"},
  2098.       {SIGPWR, "PWR", "Power-fail restart"},
  2099. + #endif
  2100. +     {SIGCLD, "CLD", "Death of a child"},
  2101.   #ifdef JOBS            /* todo: need to be more portable */
  2102.       {SIGTSTP, "TSTP", "Stop"},
  2103.       {SIGTTIN, "TTIN", "Stop (tty input)"},
  2104. ***************
  2105. *** 135,141 ****
  2106.           if (p->signal == SIGINT)
  2107.               unwind();    /* return to shell() */
  2108.           else
  2109. !             return;
  2110.       if (p->signal == 0)    /* ??? */
  2111.           p->trap = 0;
  2112.       command(trapstr);
  2113. --- 137,143 ----
  2114.           if (p->signal == SIGINT)
  2115.               unwind();    /* return to shell() */
  2116.           else
  2117. !             return 0;
  2118.       if (p->signal == 0)    /* ??? */
  2119.           p->trap = 0;
  2120.       command(trapstr);
  2121. diff -cbr orig/sh/tree.c new/sh/tree.c
  2122. *** orig/sh/tree.c    Sun May 03 18:45:18 1992
  2123. --- new/sh/tree.c    Sun May 03 19:45:27 1992
  2124. ***************
  2125. *** 9,14 ****
  2126. --- 9,15 ----
  2127.   #include "stdh.h"
  2128.   #include <errno.h>
  2129.   #include <setjmp.h>
  2130. + #include <memory.h>
  2131.   
  2132.   #ifdef __STDC__
  2133.   # include <stdarg.h>
  2134. diff -cbr orig/sh/tty.h new/sh/tty.h
  2135. *** orig/sh/tty.h    Tue Aug 25 15:20:20 1992
  2136. --- new/sh/tty.h    Tue Aug 25 16:07:28 1992
  2137. ***************
  2138. *** 6,11 ****
  2139. --- 6,12 ----
  2140.       last edit:    30-Jul-1987    D A Gwyn
  2141.   */
  2142.   
  2143. + #ifndef _OS2
  2144.   #if _BSD_SYSV            /* BRL UNIX System V emulation */
  2145.   #include <termio.h>    /* includes <sys/_ioctl.h> */
  2146.   #ifndef NTTYDISC
  2147. ***************
  2148. *** 35,37 ****
  2149. --- 36,39 ----
  2150.   #endif
  2151.   #endif
  2152.   #endif    /* _BSD_SYSV */
  2153. + #endif  /* OS2 */
  2154. diff -cbr orig/sh/var.c new/sh/var.c
  2155. *** orig/sh/var.c    Tue Aug 25 15:20:20 1992
  2156. --- new/sh/var.c    Tue Aug 25 15:23:12 1992
  2157. ***************
  2158. *** 6,11 ****
  2159. --- 6,12 ----
  2160.   #include <errno.h>
  2161.   #include <setjmp.h>
  2162.   #include <time.h>
  2163. + #include <sys/types.h>
  2164.   #include "sh.h"
  2165.   #include "expand.h"
  2166.   
  2167. diff -cbr orig/sh/vi.c new/sh/vi.c
  2168. *** orig/sh/vi.c    Tue Aug 25 15:20:21 1992
  2169. --- new/sh/vi.c    Tue Sep 08 13:04:13 1992
  2170. ***************
  2171. *** 73,79 ****
  2172.   #define isundoable(c)    (!(classify[c]&U_))
  2173.   #define issrch(c)    (classify[c]&S_)
  2174.   
  2175. ! char    classify[128] = {
  2176.       B_,    0,    0,    0,    0,    0,    O_,    0,
  2177.   #if 1    /* Mike B. changes */
  2178.       C_|M_,    0,    O_,    0,    O_,    O_,    O_,    0,
  2179. --- 73,79 ----
  2180.   #define isundoable(c)    (!(classify[c]&U_))
  2181.   #define issrch(c)    (classify[c]&S_)
  2182.   
  2183. ! char    classify[256] = {
  2184.       B_,    0,    0,    0,    0,    0,    O_,    0,
  2185.   #if 1    /* Mike B. changes */
  2186.       C_|M_,    0,    O_,    0,    O_,    O_,    O_,    0,
  2187. ***************
  2188. *** 1134,1140 ****
  2189.   static int    pwidth;            /* width of prompt */
  2190.   static int    winwidth;        /* width of window */
  2191.   /*static char    *wbuf[2];        /* window buffers */
  2192. ! static char    wbuf[2][80-3];    /* window buffers */ /* TODO */
  2193.   static int    win;            /* window buffer in use */
  2194.   static char    morec;            /* more character at right of window */
  2195.   static int    lastref;        /* argument to last refresh() */
  2196. --- 1134,1140 ----
  2197.   static int    pwidth;            /* width of prompt */
  2198.   static int    winwidth;        /* width of window */
  2199.   /*static char    *wbuf[2];        /* window buffers */
  2200. ! static char    wbuf[2][128-3];    /* window buffers */ /* TODO */
  2201.   static int    win;            /* window buffer in use */
  2202.   static char    morec;            /* more character at right of window */
  2203.   static int    lastref;        /* argument to last refresh() */
  2204. ***************
  2205. *** 1597,1603 ****
  2206.       }
  2207.   #if 0
  2208.       /*
  2209. !      * Hack to fix teh ^r redraw problem, but it redraws way too much.
  2210.        * Probably unacceptable at low baudrates.  Someone please fix this
  2211.        */
  2212.       else
  2213. --- 1597,1603 ----
  2214.       }
  2215.   #if 0
  2216.       /*
  2217. !      * Hack to fix the ^r redraw problem, but it redraws way too much.
  2218.        * Probably unacceptable at low baudrates.  Someone please fix this
  2219.        */
  2220.       else
  2221. ***************
  2222. *** 1664,1674 ****
  2223.   
  2224.   getch()
  2225.   {
  2226. !     char    buf;
  2227.   
  2228.       if (read(ttyfd, &buf, 1) != 1)
  2229.           return -1;
  2230.       if ((buf & 0x7f) == Ctrl('c')) {
  2231.           /*
  2232.            * If you hit ctrl-c, the buffer was left in a
  2233.            * strange state; the next command typed was
  2234. --- 1664,1685 ----
  2235.   
  2236.   getch()
  2237.   {
  2238. !     unsigned char    buf;
  2239.   
  2240. + #ifdef OS2
  2241. +         do
  2242. +         {
  2243. +           buf = _read_kbd(0, 1, 0);
  2244. +           if ( buf == 0 || buf == 0xE0 )
  2245. +             _read_kbd(0, 1, 0);
  2246. +         }
  2247. +         while ( buf == 0 || buf == 0xE0 );
  2248. +     if (buf == Ctrl('c')) {
  2249. + #else
  2250.       if (read(ttyfd, &buf, 1) != 1)
  2251.           return -1;
  2252.       if ((buf & 0x7f) == Ctrl('c')) {
  2253. + #endif
  2254.           /*
  2255.            * If you hit ctrl-c, the buffer was left in a
  2256.            * strange state; the next command typed was
  2257. ***************
  2258. *** 1688,1696 ****
  2259. --- 1699,1713 ----
  2260.           undo->cursor = 0;
  2261.           x_mode(FALSE);
  2262.           trapsig(SIGINT);
  2263. + #ifdef OS2
  2264. +     } else if (buf == Ctrl('d'))
  2265. +         return -1;
  2266. +     return buf;
  2267. + #else
  2268.       } else if ((buf & 0x7f) == Ctrl('d'))
  2269.           return -1;
  2270.       return buf & 0x7f;
  2271. + #endif
  2272.   }
  2273.   
  2274.   
  2275.