home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / zip / cli / tcsh.zoo / source / diffs < prev    next >
Text File  |  1991-12-15  |  52KB  |  2,170 lines

  1. *** ./orig/config_f.h    Fri Oct 25 22:35:28 1991
  2. --- ./config_f.h    Mon Nov 11 17:19:28 1991
  3. ***************
  4. *** 56,62 ****
  5.    *        if you don't have <locale.h>, you don't want
  6.    *        to define this.
  7.    */
  8. ! #define NLS
  9.   
  10.   /*
  11.    * LOGINFIRST   Source ~/.login before ~/.cshrc
  12. --- 56,62 ----
  13.    *        if you don't have <locale.h>, you don't want
  14.    *        to define this.
  15.    */
  16. ! #undef NLS
  17.   
  18.   /*
  19.    * LOGINFIRST   Source ~/.login before ~/.cshrc
  20. ***************
  21. *** 95,101 ****
  22.    *        on the name of the tty, and environment.
  23.    *        Does not make sense in the modern window systems!
  24.    */
  25. ! #define AUTOLOGOUT
  26.   
  27.   /*
  28.    * SUSPENDED    Newer shells say 'Suspended' instead of 'Stopped'.
  29. --- 95,101 ----
  30.    *        on the name of the tty, and environment.
  31.    *        Does not make sense in the modern window systems!
  32.    */
  33. ! #undef AUTOLOGOUT
  34.   
  35.   /*
  36.    * SUSPENDED    Newer shells say 'Suspended' instead of 'Stopped'.
  37. ***************
  38. *** 116,121 ****
  39. --- 116,129 ----
  40.    *        provided.
  41.    */
  42.   #undef SYSMALLOC
  43. + /*
  44. +  * ALTESC    Allow the user to define the escape character to be something
  45. +  *        other than \ (useful if \ is a common file name character.
  46. +  *        e.g. for MiNT)
  47. +  */
  48. + #define ALTESC
  49.   
  50.   
  51.   /*
  52. *** ./orig/ed.chared.c    Fri Oct 25 22:33:24 1991
  53. --- ./ed.chared.c    Mon Nov 11 17:55:18 1991
  54. ***************
  55. *** 470,476 ****
  56. --- 470,480 ----
  57.       for (;;) {
  58.       while (*p != HIST && p < Cursor)
  59.           ++p;
  60. + #ifdef ALTESC
  61. +     for (i = 1; (p - i) >= InputBuf && p[-i] == escchar; i++);
  62. + #else
  63.       for (i = 1; (p - i) >= InputBuf && p[-i] == '\\'; i++);
  64. + #endif
  65.       if (i % 2 == 0)
  66.           ++p;
  67.       if (p >= Cursor)
  68. *** ./orig/ed.init.c    Fri Oct 25 22:33:42 1991
  69. --- ./ed.init.c    Mon Nov 11 16:20:30 1991
  70. ***************
  71. *** 43,48 ****
  72. --- 43,52 ----
  73.   #include "tc.h"
  74.   #include "ed.defns.h"
  75.   
  76. + #ifdef __MINT__
  77. + extern int __mint;    /* version of MiNT we're running under */
  78. + #endif
  79.   #if defined(TERMIO) || defined(POSIX)
  80.   /*
  81.    * Aix compatible names
  82. ***************
  83. *** 1035,1044 ****
  84. --- 1039,1061 ----
  85.   #else /* GSTTY */
  86.       if (T_Tabs) {        /* order of &= and |= is important to XTABS */
  87.       xb.sg_flags &= ~(RAW | ECHO | LCASE | XTABS | VTDELAY | ALLDELAY);
  88. + # ifdef __MINT__
  89. + /* TOS, and older versions of MiNT, have trouble with CBREAK mode, so we use
  90. +  * raw mode instead
  91. +  */
  92. +     if (__mint < 91)
  93. +         xb.sg_flags |= (RAW | CRMOD | ANYP);
  94. +     else
  95. + # endif /* __MINT__ */
  96.       xb.sg_flags |= (CBREAK | CRMOD | ANYP);
  97.       }
  98.       else {
  99.       xb.sg_flags &= ~(RAW | ECHO | LCASE | VTDELAY | ALLDELAY);
  100. + # ifdef __MINT__
  101. +     if (__mint < 91)
  102. +         xb.sg_flags |= (RAW | CRMOD | ANYP | XTABS);
  103. +     else
  104. + # endif /* __MINT__ */
  105.       xb.sg_flags |= (CBREAK | CRMOD | ANYP | XTABS);
  106.       }
  107.   
  108. *** ./orig/ed.inputl.c    Fri Oct 25 22:33:46 1991
  109. --- ./ed.inputl.c    Mon Nov 25 12:55:42 1991
  110. ***************
  111. *** 53,59 ****
  112. --- 53,63 ----
  113.   extern bool Tty_raw_mode;
  114.   
  115.   /* mismatched first character */
  116. + #ifdef ALTESC
  117. + static Char mismatch[] = {'!', '^', '-', '%', '\0'};
  118. + #else
  119.   static Char mismatch[] = {'!', '\\', '^', '-', '%', '\0'};
  120. + #endif
  121.   
  122.   static    int    GetNextCommand    __P((KEYCMD *, Char *));
  123.   static    int    SpellLine    __P((int));
  124. ***************
  125. *** 86,92 ****
  126. --- 90,101 ----
  127.       if (!Tty_raw_mode && MacroLvl < 0) {
  128.       long    chrs = 0;
  129.   
  130. + #ifndef __MINT__
  131. + /* MiNT _always_ wants to go into raw mode, so don't bother with the
  132. +  * FIONREAD test
  133. +  */
  134.       (void) ioctl(SHIN, FIONREAD, (ioctl_t) & chrs);
  135. + #endif
  136.       if (chrs == 0) {
  137.           if (Rawmode() < 0)
  138.           return 0;
  139. ***************
  140. *** 553,559 ****
  141. --- 562,572 ----
  142.           Cursor--;
  143.           endflag = 0;
  144.       }
  145. + #ifdef ALTESC
  146. +     if (!Strchr(mismatch, *argptr) && *argptr != escchar &&
  147. + #else
  148.       if (!Strchr(mismatch, *argptr) &&
  149. + #endif
  150.           (!cmdonly || starting_a_command(argptr, InputBuf))) {
  151.           switch (tenematch(InputBuf, INBUFSIZ, Cursor - InputBuf, SPELL)) {
  152.           case 1:        /* corrected */
  153. *** ./orig/glob.c    Tue Aug  6 03:19:38 1991
  154. --- ./glob.c    Mon Nov 11 23:59:02 1991
  155. ***************
  156. *** 114,123 ****
  157.   #define    NOT        '!'
  158.   #define ALTNOT        '^'
  159.   #define    QUESTION    '?'
  160. ! #define    QUOTE        '\\'
  161.   #define    RANGE        '-'
  162.   #define    RBRACKET    ']'
  163.   #define    SEP        '/'
  164.   #define    STAR        '*'
  165.   #define    TILDE        '~'
  166.   #define    UNDERSCORE    '_'
  167. --- 114,130 ----
  168.   #define    NOT        '!'
  169.   #define ALTNOT        '^'
  170.   #define    QUESTION    '?'
  171. ! #ifdef ALTESC
  172. ! #define    QUOTE        escchar
  173. ! #else
  174. ! #define QUOTE        '\\'
  175. ! #endif
  176.   #define    RANGE        '-'
  177.   #define    RBRACKET    ']'
  178.   #define    SEP        '/'
  179. + #if defined(__MINT__) && defined(ALTESC)
  180. + #define SEP2        '\\'
  181. + #endif
  182.   #define    STAR        '*'
  183.   #define    TILDE        '~'
  184.   #define    UNDERSCORE    '_'
  185. ***************
  186. *** 449,454 ****
  187. --- 456,464 ----
  188.           return (0);
  189.   
  190.           if (((pglob->gl_flags & GLOB_MARK) &&
  191. + #if defined(__MINT__) && defined(ALTESC)
  192. +          (pathend[-1] != SEP2 || escchar == SEP2) &&
  193. + #endif
  194.            pathend[-1] != SEP) &&
  195.           (S_ISDIR(sbuf.st_mode)
  196.   #ifdef S_IFLNK
  197. ***************
  198. *** 467,473 ****
  199. --- 477,487 ----
  200.       /* find end of next segment, copy tentatively to pathend */
  201.       q = pathend;
  202.       p = pattern;
  203. + #if defined(__MINT__) && defined(ALTESC)
  204. +     while (*p != EOS && *p != SEP && (*p != SEP2 || escchar == SEP2)) {
  205. + #else
  206.       while (*p != EOS && *p != SEP) {
  207. + #endif
  208.           if (ismeta(*p))
  209.           anymeta = 1;
  210.           *q++ = *p++;
  211. ***************
  212. *** 476,482 ****
  213. --- 490,500 ----
  214.       if (!anymeta) {        /* no expansion, do next segment */
  215.           pathend = q;
  216.           pattern = p;
  217. + #if defined(__MINT__) && defined(ALTESC)
  218. +         while (*pattern == SEP || (escchar != SEP2 && *pattern == SEP2))
  219. + #else
  220.           while (*pattern == SEP)
  221. + #endif
  222.           *pathend++ = *pattern++;
  223.       }
  224.       else            /* need expansion, recurse */
  225. *** ./orig/pathnames.h    Fri Oct 25 22:35:32 1991
  226. --- ./pathnames.h    Sun Nov 10 00:56:32 1991
  227. ***************
  228. *** 54,59 ****
  229. --- 54,65 ----
  230.   # define _PATH_DOTCSHRC        "/etc/cshrc"
  231.   #endif /* convex || __convex__ */
  232.   
  233. + #ifdef __MINT__
  234. + # define _PATH_DOTLOGIN        "/etc/login.csh"
  235. + # define _PATH_DOTLOGOUT    "/etc/logout.csh"
  236. + # define _PATH_DOTCSHRC        "/etc/csh.rc"
  237. + #endif /* __MINT__ */
  238.   #if defined(sgi) || defined(OREO)
  239.   # define _PATH_DOTLOGIN        "/etc/cshrc"
  240.   #endif /* sgi || OREO */
  241. ***************
  242. *** 70,76 ****
  243. --- 76,86 ----
  244.   #ifdef notdef
  245.   # define _PATH_CSHELL         "/bin/csh"
  246.   #endif
  247. + #ifdef __MINT__
  248. + #define _PATH_TCSHELL        "/bin/tcsh"
  249. + #else
  250.   #define _PATH_TCSHELL        "/usr/local/bin/tcsh"
  251. + #endif
  252.   
  253.   #define _PATH_LOGIN        "/bin/login"
  254.   #ifdef NEWGRP
  255. *** ./orig/sh.char.c    Fri Oct 25 22:32:00 1991
  256. --- ./sh.char.c    Mon Nov 11 00:31:38 1991
  257. ***************
  258. *** 49,56 ****
  259. --- 49,61 ----
  260.   /*    bs        ht        nl        vt    */
  261.       _CTR,        _CTR|_SP|_META,    _CTR|_NL|_META,    _CTR,
  262.   
  263. + #ifndef __MINT__
  264.   /*    np        cr        so        si    */
  265.       _CTR,        _CTR,        _CTR,        _CTR,
  266. + #else
  267. + /*    np        cr        so        si    */
  268. +     _CTR,        _CTR|_SP|_META,    _CTR,        _CTR,
  269. + #endif
  270.   
  271.   /*    dle        dc1        dc2        dc3    */
  272.       _CTR,        _CTR,        _CTR,        _CTR,
  273. *** ./orig/sh.dir.c    Fri Oct 25 22:31:48 1991
  274. --- ./sh.dir.c    Sat Nov 16 19:42:16 1991
  275. ***************
  276. *** 39,44 ****
  277. --- 39,48 ----
  278.   
  279.   
  280.   #include "sh.h"
  281. + #ifdef __MINT__
  282. + extern Char *Lastslash();
  283. + #endif
  284.   /*
  285.    * C Shell - directory management
  286.    */
  287. ***************
  288. *** 408,414 ****
  289. --- 412,422 ----
  290.   {
  291.       Char   *dp;
  292.   
  293. + #ifdef __MINT__
  294. +     if (!is_abspath(cp)) {
  295. + #else
  296.       if (*cp != '/') {
  297. + #endif
  298.       register Char *p, *q;
  299.       int     cwdlen;
  300.   
  301. ***************
  302. *** 477,484 ****
  303. --- 485,497 ----
  304.       serrno = errno;
  305.       }
  306.   
  307. + #ifdef __MINT__
  308. +     if (!is_abspath(cp) && !prefix(STRdotsl, cp) &&
  309. +         !prefix(STRdotdotsl, cp) && (c = adrof(STRcdpath))) {
  310. + #else
  311.       if (cp[0] != '/' && !prefix(STRdotsl, cp) && !prefix(STRdotdotsl, cp)
  312.       && (c = adrof(STRcdpath))) {
  313. + #endif
  314.       Char  **cdp;
  315.       register Char *p;
  316.       Char    buf[MAXPATHLEN];
  317. ***************
  318. *** 496,502 ****
  319. --- 509,519 ----
  320.       }
  321.       }
  322.       dp = value(cp);
  323. + #ifdef __MINT__
  324. +     if ((is_abspath(dp) || dp[0] == '.') && chdir(short2str(dp)) >= 0) {
  325. + #else
  326.       if ((dp[0] == '/' || dp[0] == '.') && chdir(short2str(dp)) >= 0) {
  327. + #endif
  328.       xfree((ptr_t) cp);
  329.       cp = Strsave(dp);
  330.       printd = 1;
  331. ***************
  332. *** 717,727 ****
  333. --- 734,752 ----
  334.        * christos: if the path given does not start with a slash prepend cwd. If
  335.        * cwd does not start with a slash or the result would be too long abort().
  336.        */
  337. + #ifdef __MINT__
  338. +     if (!is_abspath(cp)) {
  339. + #else
  340.       if (*cp != '/') {
  341. + #endif
  342.       Char    tmpdir[MAXPATHLEN];
  343.   
  344.       p1 = value(STRcwd);
  345. + #ifdef __MINT__
  346. +     if (p1 == NULL || !is_abspath(p1))
  347. + #else
  348.       if (p1 == NULL || *p1 != '/')
  349. + #endif
  350.           abort();
  351.       if (Strlen(p1) + Strlen(cp) + 1 >= MAXPATHLEN)
  352.           abort();
  353. ***************
  354. *** 743,756 ****
  355. --- 768,790 ----
  356.   
  357.       while (*p) {        /* for each component */
  358.       sp = p;            /* save slash address */
  359. + #ifdef __MINT__
  360. +     do { ++p;
  361. +     } while (is_dirsep(*p));    /* flush extra slashes */
  362. + #else
  363.       while (*++p == '/')    /* flush extra slashes */
  364.           ;
  365. + #endif
  366.       if (p != ++sp)
  367.           for (p1 = sp, p2 = p; *p1++ = *p2++;);
  368.       p = sp;            /* save start of component */
  369.       slash = 0;
  370.       while (*++p)        /* find next slash or end of path */
  371. + #ifdef __MINT__
  372. +         if (is_dirsep(*p)) {
  373. + #else
  374.           if (*p == '/') {
  375. + #endif
  376.           slash = 1;
  377.           *p = 0;
  378.           break;
  379. ***************
  380. *** 798,809 ****
  381. --- 832,851 ----
  382.            * find length of p
  383.            */
  384.           for (p1 = p; *p1++;);
  385. + #ifdef __MINT__
  386. +         if (!is_abspath(link)) {
  387. + #else
  388.           if (*link != '/') {
  389. + #endif
  390.               /*
  391.                * Relative path, expand it between the "yyy/" and the
  392.                * "/..". First, back sp up to the character past "yyy/".
  393.                */
  394. + #ifdef __MINT__
  395. +             do { --sp; } while (!is_dirsep(*sp)) ;
  396. + #else
  397.               while (*--sp != '/');
  398. + #endif
  399.               sp++;
  400.               *sp = 0;
  401.               /*
  402. ***************
  403. *** 846,852 ****
  404. --- 888,898 ----
  405.   #endif                /* S_IFLNK */
  406.           *sp = '/';
  407.           if (sp != cp)
  408. + #ifdef __MINT__
  409. +         do { --sp; } while (!is_dirsep(*sp));
  410. + #else
  411.           while (*--sp != '/');
  412. + #endif
  413.           if (slash) {
  414.           for (p1 = sp + 1, p2 = p + 1; *p1++ = *p2++;);
  415.           p = sp;
  416. ***************
  417. *** 881,893 ****
  418. --- 927,947 ----
  419.            * find length of p
  420.            */
  421.           for (p1 = p; *p1++;);
  422. + #ifdef __MINT__
  423. +         if (!is_abspath(link)) {
  424. + #else
  425.           if (*link != '/') {
  426. + #endif
  427.               /*
  428.                * Relative path, expand it between the "yyy/" and the
  429.                * remainder. First, back sp up to the character past
  430.                * "yyy/".
  431.                */
  432. + #ifdef __MINT__
  433. +             do { --sp; } while (!is_dirsep(*sp));
  434. + #else
  435.               while (*--sp != '/');
  436. + #endif
  437.               sp++;
  438.               *sp = 0;
  439.               /*
  440. ***************
  441. *** 942,949 ****
  442. --- 996,1008 ----
  443.       /*
  444.        * See if we're not in a subdir of STRhome
  445.        */
  446. + #ifdef __MINT__
  447. +     if (p1 && is_abspath(p1) &&
  448. +     (Strncmp(p1, cp, cc) != 0 || (!is_dirsep(cp[cc]) && cp[cc] != '\0'))) {
  449. + #else
  450.       if (p1 && *p1 == '/' &&
  451.       (Strncmp(p1, cp, cc) != 0 || (cp[cc] != '/' && cp[cc] != '\0'))) {
  452. + #endif
  453.       static ino_t home_ino = -1;
  454.       static dev_t home_dev = -1;
  455.       static Char *home_ptr = NULL;
  456. ***************
  457. *** 968,975 ****
  458. --- 1027,1040 ----
  459.           sp = (Char *) - 1;
  460.           break;
  461.           }
  462. + #ifdef __MINT__
  463. +         sp = Lastslash(p2);
  464. +         if (sp == 0 && p2[1] == ':') sp = p2;
  465. +         if (sp) *sp = '\0';
  466. + #else
  467.           if (sp = Strrchr(p2, '/'))
  468.           *sp = '\0';
  469. + #endif
  470.       }
  471.       /*
  472.        * See if we found it
  473. *** ./orig/sh.dol.c    Fri Oct 25 22:31:52 1991
  474. --- ./sh.dol.c    Sat Nov 16 16:40:26 1991
  475. ***************
  476. *** 173,179 ****
  477.   
  478.       for (;;) {
  479.       c = DgetC(DODOL);
  480. !     if (c == '\\') {
  481.           c = DgetC(0);
  482.           if (c == DEOF) {
  483.           unDredc(c);
  484. --- 173,179 ----
  485.   
  486.       for (;;) {
  487.       c = DgetC(DODOL);
  488. !     if (c == escchar) {
  489.           c = DgetC(0);
  490.           if (c == DEOF) {
  491.           unDredc(c);
  492. ***************
  493. *** 297,303 ****
  494. --- 297,308 ----
  495.           }
  496.           break;
  497.   
  498. + #ifdef ALTESC
  499. +     default:
  500. +         if (c != escchar) break;
  501. + #else
  502.       case '\\':
  503. + #endif
  504.           c = DgetC(0);    /* No $ subst! */
  505.           if (c == '\n' || c == DEOF) {
  506.           done = 0;
  507. ***************
  508. *** 748,755 ****
  509.       register Char *lbp, *obp, *mbp;
  510.       Char  **vp;
  511.       bool    quoted;
  512.       char   *tmp;
  513.       if (creat(tmp = short2str(shtemp), 0600) < 0)
  514.       stderror(ERR_SYSTEM, tmp, strerror(errno));
  515.       (void) close(0);
  516. --- 753,769 ----
  517.       register Char *lbp, *obp, *mbp;
  518.       Char  **vp;
  519.       bool    quoted;
  520. + #ifdef __MINT__
  521. +     int tf;
  522. +     extern int csh_tmpfile();    /* in sh.c */
  523. +     tf = csh_tmpfile();
  524. +     if (tf < 0)
  525. +         stderror(ERR_SYSTEM, "tmpfile", strerror(errno));
  526. +     (void)dup2(tf, 0);
  527. +     (void)close(tf);
  528. + #else
  529.       char   *tmp;
  530.       if (creat(tmp = short2str(shtemp), 0600) < 0)
  531.       stderror(ERR_SYSTEM, tmp, strerror(errno));
  532.       (void) close(0);
  533. ***************
  534. *** 760,766 ****
  535. --- 774,783 ----
  536.       errno = oerrno;
  537.       stderror(ERR_SYSTEM, tmp, strerror(errno));
  538.       }
  539.       (void) unlink(tmp);        /* 0 0 inode! */
  540. + #endif /* __MINT__ */
  541.       Dv[0] = term;
  542.       Dv[1] = NOSTR;
  543.       gflag = 0;
  544. ***************
  545. *** 830,839 ****
  546.           if ((c &= TRIM) == 0)
  547.           continue;
  548.           /* \ quotes \ $ ` here */
  549. !         if (c == '\\') {
  550.           c = DgetC(0);
  551.           if (!any("$\\`", c))
  552. !             unDgetC(c | QUOTE), c = '\\';
  553.           else
  554.               c |= QUOTE;
  555.           }
  556. --- 847,860 ----
  557.           if ((c &= TRIM) == 0)
  558.           continue;
  559.           /* \ quotes \ $ ` here */
  560. !         if (c == escchar) {
  561.           c = DgetC(0);
  562. + #ifdef ALTESC
  563. +         if (c != '$' && c != escchar && c != '`')
  564. + #else
  565.           if (!any("$\\`", c))
  566. ! #endif
  567. !             unDgetC(c | QUOTE), c = escchar;
  568.           else
  569.               c |= QUOTE;
  570.           }
  571. ***************
  572. *** 887,889 ****
  573. --- 908,911 ----
  574.           blkfree(pargv), pargv = 0;
  575.       }
  576.   }
  577. *** ./orig/sh.exec.c    Fri Oct 25 22:31:58 1991
  578. --- ./sh.exec.c    Sun Nov 10 13:07:34 1991
  579. ***************
  580. *** 41,50 ****
  581. --- 41,64 ----
  582.   #include "tc.h"
  583.   #include "tw.h"
  584.   
  585. + #ifdef __MINT__
  586. + /* MiNT/TOS programs are typically given one of the following extensions;
  587. +  * during an exec we should try all of them
  588. +  */
  589. + #define TOS_EXT 6
  590. + char *tos_extension[] = { "", ".ttp", ".prg", ".tos", ".gtp", ".csh" };
  591. + #endif
  592.   /*
  593.    * C shell
  594.    */
  595.   
  596. + #ifdef __MINT__
  597. + extern char **environ;
  598. + int csh_execve(char *, char **, char **);
  599. + #define execv(f, t) csh_execve(f, t, environ)
  600. + #endif
  601.   /*
  602.    * System level search and execute of a command.
  603.    * We look in each directory for the specified command name.
  604. ***************
  605. *** 480,485 ****
  606. --- 494,511 ----
  607.           (dp->d_name[1] == '\0' ||
  608.            dp->d_name[1] == '.' && dp->d_name[2] == '\0'))
  609.           continue;
  610. + #ifdef __MINT__
  611. +         {    char *s = rindex(dp->d_name, '.');
  612. +             int i;
  613. +         if (s)
  614. +             for (i = 0; i < TOS_EXT; i++) {
  615. +             if (!strcmp(s, tos_extension[i])) {
  616. +                 *s = 0; break;
  617. +             }
  618. +             }
  619. +         }
  620. + #endif /* __MINT__ */
  621.           hashval = hash(hashname(str2short(dp->d_name)), i);
  622.           bis(xhash, hashval);
  623.           /* tw_add_comm_name (dp->d_name); */
  624. ***************
  625. *** 586,591 ****
  626. --- 612,653 ----
  627.    * if dir_ok is set and the pathname refers to a directory.
  628.    * This is a bit kludgy, but in the name of optimization...
  629.    */
  630. + #ifdef __MINT__
  631. + int
  632. + executable(dir, name, dir_ok)
  633. +     Char   *dir, *name;
  634. +     bool    dir_ok;
  635. + {
  636. +     char *ext;
  637. +     int i;
  638. +     struct stat stbuf;
  639. +     Char    path[MAXPATHLEN + 1];
  640. +     char   *strname;
  641. +     if (dir && *dir) {
  642. +     copyn(path, dir, MAXPATHLEN);
  643. +     catn(path, name, MAXPATHLEN);
  644. +     strname = short2str(path);
  645. +     }
  646. +     else
  647. +     strname = short2str(name);
  648. +     ext = name = alloca(strlen(strname) + 5);
  649. +     while (*strname)
  650. +     *ext++ = *strname++;
  651. +     for (i = 0; i < TOS_EXT; i++) {
  652. +     strcpy(ext, tos_extension[i]);
  653. +     if (stat(name, &stbuf) != -1 &&
  654. +         ((dir_ok && S_ISDIR(stbuf.st_mode)) ||
  655. +              (S_ISREG(stbuf.st_mode) &&
  656. +               ((stbuf.st_mode & (S_IXOTH|S_IXGRP|S_IXUSR)) || i == TOS_EXT-1))))
  657. +         return 1;
  658. +     }
  659. +     return 0;
  660. + }
  661. + #else /* __MINT__ */
  662.   int
  663.   executable(dir, name, dir_ok)
  664.       Char   *dir, *name;
  665. ***************
  666. *** 609,614 ****
  667. --- 671,677 ----
  668.             access(strname, X_OK) == 0) ||
  669.            (dir_ok && S_ISDIR(stbuf.st_mode))));
  670.   }
  671. + #endif /* __MINT__ */
  672.   
  673.   void
  674.   tellmewhat(lex)
  675. ***************
  676. *** 699,701 ****
  677. --- 762,792 ----
  678.       }
  679.       sp->word = s0;        /* we save and then restore this */
  680.   }
  681. + #ifdef __MINT__
  682. + #include <process.h>
  683. + int
  684. + csh_execve(path, argv, envp)
  685. +     char *path;
  686. +     char **argv, **envp;
  687. + {
  688. +     int i;
  689. +     char *newpath, *s;
  690. +     newpath = s = alloca(strlen(path) + 5);
  691. +     while (*path) {
  692. +         *s++ = *path++;
  693. +     }
  694. +     *s = 0;
  695. +     for (i = 0; i < TOS_EXT; i++) {
  696. +         strcpy(s, tos_extension[i]);
  697. +         if (access(newpath, 0) == 0) {
  698. +             return _spawnve(P_OVERLAY, newpath, argv, envp);
  699. +         }
  700. +     }
  701. +     return -1;
  702. + }
  703. + #endif /* __MINT__ */
  704. *** ./orig/sh.func.c    Fri Oct 25 22:32:12 1991
  705. --- ./sh.func.c    Mon Nov 11 18:06:16 1991
  706. ***************
  707. *** 272,278 ****
  708. --- 272,289 ----
  709.       islogin();
  710.       rechist();
  711.       (void) signal(SIGTERM, parterm);
  712. + #ifdef __MINT__
  713. +     {
  714. +         extern int csh_execve();        /* in sh.exec.c */
  715. +         extern char **environ;
  716. +     char *args[3];
  717. +     
  718. +     args[0] = "login"; args[1] = short2str(v[1]); args[2] = NULL;
  719. +     (void)csh_execve(_PATH_LOGIN, args, environ);
  720. +     }
  721. + #else
  722.       (void) execl(_PATH_LOGIN, "login", short2str(v[1]), NULL);
  723. + #endif
  724.       untty();
  725.       xexit(1);
  726.   }
  727. ***************
  728. *** 818,824 ****
  729. --- 829,839 ----
  730.       found = 1;
  731.       do {
  732.           c = readc(1);
  733. + #ifdef ALTESC
  734. +         if (c == escchar && (c = readc(1)) == '\n')
  735. + #else
  736.           if (c == '\\' && (c = readc(1)) == '\n')
  737. + #endif
  738.           c = ' ';
  739.           if (c == '\'' || c == '"')
  740.           if (d == 0)
  741. *** ./orig/sh.glob.c    Fri Oct 25 22:32:16 1991
  742. --- ./sh.glob.c    Mon Nov 11 23:52:12 1991
  743. ***************
  744. *** 95,101 ****
  745. --- 95,106 ----
  746.       gstart = gbuf;
  747.       *gstart++ = *s++;
  748.       u = s;
  749. + #ifdef __MINT__
  750. +     for (b = gstart, e = &gbuf[MAXPATHLEN-1]; *s && *s != '/' && *s != '\\' &&
  751. +         b < e;
  752. + #else
  753.       for (b = gstart, e = &gbuf[MAXPATHLEN - 1]; *s && *s != '/' && b < e;
  754. + #endif
  755.        *b++ = *s++);
  756.       *b = EOS;
  757.       if (gethdir(gstart)) {
  758. ***************
  759. *** 132,138 ****
  760. --- 137,148 ----
  761.        * kfk - 17 Jan 1984 - stack hack allows user to get at arbitrary dir names
  762.        * in stack. PWP: let =foobar pass through (for X windows)
  763.        */
  764. + #ifdef __MINT__
  765. +     if ((Isdigit(s[1]) || s[1] == '-') && (s[2] == '\0' || s[2] == '/' ||
  766. +                          s[2] == '\\')) {
  767. + #else
  768.       if ((Isdigit(s[1]) || s[1] == '-') && (s[2] == '\0' || s[2] == '/')) {
  769. + #endif
  770.       dig = (s[1] == '-') ? -1 : s[1] - '0';
  771.       if (!getstakd(gp, dig)) {
  772.           blkfree(nv);
  773. ***************
  774. *** 613,619 ****
  775. --- 623,633 ----
  776.       }
  777.       lp++;
  778.       for (rp = lp; *rp && *rp != '`'; rp++)
  779. + #ifdef ALTESC
  780. +         if (*rp == escchar) {
  781. + #else
  782.           if (*rp == '\\') {
  783. + #endif
  784.           rp++;
  785.           if (!*rp)
  786.               goto oops;
  787. ***************
  788. *** 742,748 ****
  789. --- 756,766 ----
  790.           hadnl = 1;
  791.           continue;
  792.           }
  793. + #ifndef __MINT__
  794.           if (!quoted && (c == ' ' || c == '\t'))
  795. + #else
  796. +         if (!quoted && (c == ' ' || c == '\t' || c == '\r'))
  797. + #endif
  798.           break;
  799.           cnt++;
  800.           psave(c | quoted);
  801. *** ./orig/sh.h    Fri Oct 25 22:32:58 1991
  802. --- ./sh.h    Sat Nov 16 18:55:06 1991
  803. ***************
  804. *** 106,112 ****
  805.   #ifdef _SEQUENT_
  806.   # include <sys/procstats.h>
  807.   #endif /* _SEQUENT_ */
  808. ! #if defined(POSIX) || SVID > 0
  809.   # include <sys/times.h>
  810.   #endif /* POSIX || SVID > 0 */
  811.   
  812. --- 106,112 ----
  813.   #ifdef _SEQUENT_
  814.   # include <sys/procstats.h>
  815.   #endif /* _SEQUENT_ */
  816. ! #if defined(POSIX) || SVID > 0 || defined(__MINT__)
  817.   # include <sys/times.h>
  818.   #endif /* POSIX || SVID > 0 */
  819.   
  820. ***************
  821. *** 142,148 ****
  822.   # include <termios.h>
  823.   #endif /* POSIX */
  824.   
  825. ! #ifdef POSIX
  826.   /*
  827.    * We should be using setpgid and setpgid
  828.    * by now, but in some systems we use the
  829. --- 142,148 ----
  830.   # include <termios.h>
  831.   #endif /* POSIX */
  832.   
  833. ! #if defined(POSIX) || defined(__MINT__)
  834.   /*
  835.    * We should be using setpgid and setpgid
  836.    * by now, but in some systems we use the
  837. ***************
  838. *** 245,250 ****
  839. --- 245,255 ----
  840.   #endif 
  841.   
  842.   
  843. + #ifdef __MINT__
  844. + #define is_dirsep(c) ((c) == '/' || (c) == '\\')
  845. + #define is_abspath(p) (is_dirsep(*p) || (p[1] == ':'))
  846. + #endif
  847.   typedef int bool;
  848.   
  849.   #include "sh.types.h"
  850. ***************
  851. *** 433,438 ****
  852. --- 438,449 ----
  853.   
  854.   sigret_t (*parintr) ();        /* Parents interrupt catch */
  855.   sigret_t (*parterm) ();        /* Parents terminate catch */
  856. + #ifdef ALTESC
  857. + Char escchar;    /* character that should be used instead of \ for quoting */
  858. + #else
  859. + #define escchar '\\'
  860. + #endif
  861.   
  862.   /*
  863.    * Lexical definitions.
  864. *** ./orig/sh.lex.c    Fri Oct 25 22:32:28 1991
  865. --- ./sh.lex.c    Sun Nov 17 14:27:08 1991
  866. ***************
  867. *** 114,120 ****
  868. --- 114,128 ----
  869.    */
  870.   static bool hadhist = 0;
  871.   
  872. + #ifdef ALTESC
  873.   /*
  874. +  * this is the actual escape character (normally hardwired to '\\'),
  875. +  * which we allow changing via "set histchar=^", for example.
  876. +  */
  877. + Char escchar = '\\';
  878. + #endif
  879. + /*
  880.    * Avoid alias expansion recursion via \!#
  881.    */
  882.   int     hleft;
  883. ***************
  884. *** 148,154 ****
  885. --- 156,166 ----
  886.       alvecp = 0, hadhist = 0;
  887.       do
  888.       c = readc(0);
  889. + #ifdef __MINT__
  890. +     while (c == ' ' || c == '\t' || c == '\r');
  891. + #else
  892.       while (c == ' ' || c == '\t');
  893. + #endif
  894.       if (c == HISTSUB && intty)
  895.       /* ^lef^rit    from tty is short !:s^lef^rit */
  896.       getexcl(c);
  897. ***************
  898. *** 249,255 ****
  899. --- 261,271 ----
  900.       wp = wbuf;
  901.       i = BUFSIZ - 4;
  902.   loop:
  903. + #ifdef __MINT__
  904. +     while ((c = getC(DOALL)) == ' ' || c == '\t' || c == '\r');
  905. + #else
  906.       while ((c = getC(DOALL)) == ' ' || c == '\t');
  907. + #endif
  908.       if (cmap(c, _META | _ESC))
  909.       switch (c) {
  910.       case '&':
  911. ***************
  912. *** 272,278 ****
  913.           c1 = c;
  914.           c = getC(0);
  915.           } while (c != '\n');
  916. !         if (c1 == '\\')
  917.           goto loop;
  918.           /* fall into ... */
  919.   
  920. --- 288,294 ----
  921.           c1 = c;
  922.           c = getC(0);
  923.           } while (c != '\n');
  924. !         if (c1 == escchar)
  925.           goto loop;
  926.           /* fall into ... */
  927.   
  928. ***************
  929. *** 283,289 ****
  930. --- 299,310 ----
  931.           *wp++ = c;
  932.           goto ret;
  933.   
  934. + #ifdef ALTESC
  935. +     default:
  936. +         if (c != escchar) break;
  937. + #else
  938.       case '\\':
  939. + #endif
  940.           c = getC(0);
  941.           if (c == '\n') {
  942.           if (onelflg == 1)
  943. ***************
  944. *** 291,297 ****
  945.           goto loop;
  946.           }
  947.           if (c != HIST)
  948. !         *wp++ = '\\', --i;
  949.           c |= QUOTE;
  950.       }
  951.       c1 = 0;
  952. --- 312,318 ----
  953.           goto loop;
  954.           }
  955.           if (c != HIST)
  956. !         *wp++ = escchar, --i;
  957.           c |= QUOTE;
  958.       }
  959.       c1 = 0;
  960. ***************
  961. *** 302,308 ****
  962.           c1 = 0;
  963.           dolflg = DOALL;
  964.           }
  965. !         else if (c == '\\') {
  966.           c = getC(0);
  967.   /*
  968.    * PWP: this is dumb, but how all of the other shells work.  If \ quotes
  969. --- 323,329 ----
  970.           c1 = 0;
  971.           dolflg = DOALL;
  972.           }
  973. !         else if (c == escchar) {
  974.           c = getC(0);
  975.   /*
  976.    * PWP: this is dumb, but how all of the other shells work.  If \ quotes
  977. ***************
  978. *** 316,322 ****
  979.           else {
  980.               if (bslash_quote &&
  981.               ((c == '\'') || (c == '"') ||
  982. !              (c == '\\'))) {
  983.               c |= QUOTE;
  984.               }
  985.               else {
  986. --- 337,343 ----
  987.           else {
  988.               if (bslash_quote &&
  989.               ((c == '\'') || (c == '"') ||
  990. !              (c == escchar))) {
  991.               c |= QUOTE;
  992.               }
  993.               else {
  994. ***************
  995. *** 326,332 ****
  996.                    */
  997.                   c |= QUOTE;
  998.               ungetC(c);
  999. !             c = '\\';
  1000.               }
  1001.           }
  1002.           }
  1003. --- 347,353 ----
  1004.                    */
  1005.                   c |= QUOTE;
  1006.               ungetC(c);
  1007. !             c = escchar;
  1008.               }
  1009.           }
  1010.           }
  1011. ***************
  1012. *** 337,343 ****
  1013.           }
  1014.       }
  1015.       else if (cmap(c, _META | _Q | _Q1 | _ESC)) {
  1016. !         if (c == '\\') {
  1017.           c = getC(0);
  1018.           if (c == '\n') {
  1019.               if (onelflg == 1)
  1020. --- 358,364 ----
  1021.           }
  1022.       }
  1023.       else if (cmap(c, _META | _Q | _Q1 | _ESC)) {
  1024. !         if (c == escchar) {
  1025.           c = getC(0);
  1026.           if (c == '\n') {
  1027.               if (onelflg == 1)
  1028. ***************
  1029. *** 345,351 ****
  1030.               break;
  1031.           }
  1032.           if (c != HIST)
  1033. !             *wp++ = '\\', --i;
  1034.           c |= QUOTE;
  1035.           }
  1036.           else if (cmap(c, _Q | _Q1)) {    /* '"` */
  1037. --- 366,372 ----
  1038.               break;
  1039.           }
  1040.           if (c != HIST)
  1041. !             *wp++ = escchar, --i;
  1042.           c |= QUOTE;
  1043.           }
  1044.           else if (cmap(c, _Q | _Q1)) {    /* '"` */
  1045. ***************
  1046. *** 440,446 ****
  1047. --- 461,471 ----
  1048.   
  1049.       np = name, *np++ = '$';
  1050.       c = sc = getC(DOEXCL);
  1051. + #ifdef __MINT__
  1052. +     if (any("\t \n\r", c)) {
  1053. + #else
  1054.       if (any("\t \n", c)) {
  1055. + #endif
  1056.       ungetD(c);
  1057.       ungetC('$' | QUOTE);
  1058.       return;
  1059. ***************
  1060. *** 762,768 ****
  1061. --- 787,797 ----
  1062.   
  1063.       case 's':
  1064.           delim = getC(0);
  1065. + #ifdef __MINT__
  1066. +         if (letter(delim) || Isdigit(delim) || any(" \t\r\n", delim)) {
  1067. + #else
  1068.           if (letter(delim) || Isdigit(delim) || any(" \t\n", delim)) {
  1069. + #endif
  1070.           unreadc(delim);
  1071.           lhsb[0] = 0;
  1072.           seterror(ERR_BADSUBST);
  1073. ***************
  1074. *** 782,791 ****
  1075.               seterror(ERR_BADSUBST);
  1076.               return (en);
  1077.           }
  1078. !         if (c == '\\') {
  1079.               c = getC(0);
  1080. !             if (c != delim && c != '\\')
  1081. !             *cp++ = '\\';
  1082.           }
  1083.           *cp++ = c;
  1084.           }
  1085. --- 811,820 ----
  1086.               seterror(ERR_BADSUBST);
  1087.               return (en);
  1088.           }
  1089. !         if (c == escchar) {
  1090.               c = getC(0);
  1091. !             if (c != delim && c != escchar)
  1092. !             *cp++ = escchar;
  1093.           }
  1094.           *cp++ = c;
  1095.           }
  1096. ***************
  1097. *** 819,828 ****
  1098.               seterror(ERR_RHSLONG);
  1099.               return (en);
  1100.           }
  1101. !         if (c == '\\') {
  1102.               c = getC(0);
  1103.               if (c != delim /* && c != '~' */ )
  1104. !             *cp++ = '\\';
  1105.           }
  1106.           *cp++ = c;
  1107.           }
  1108. --- 848,857 ----
  1109.               seterror(ERR_RHSLONG);
  1110.               return (en);
  1111.           }
  1112. !         if (c == escchar) {
  1113.               c = getC(0);
  1114.               if (c != delim /* && c != '~' */ )
  1115. !             *cp++ = escchar;
  1116.           }
  1117.           *cp++ = c;
  1118.           }
  1119. ***************
  1120. *** 965,971 ****
  1121. --- 994,1004 ----
  1122.       case 'q':
  1123.       wp = Strsave(cp);
  1124.       for (xp = wp; c = *xp; xp++)
  1125. + #ifdef __MINT__
  1126. +         if ((c != ' ' && c != '\t' && c != '\r') || type == 'q')
  1127. + #else
  1128.           if ((c != ' ' && c != '\t') || type == 'q')
  1129. + #endif
  1130.           *xp |= QUOTE;
  1131.       return (wp);
  1132.   
  1133. ***************
  1134. *** 1145,1151 ****
  1135. --- 1178,1188 ----
  1136.           }
  1137.           np = lhsb;
  1138.           event = 0;
  1139. + #ifdef __MINT__
  1140. +         while (!any(": \t\\\n\r}", c)) {
  1141. + #else
  1142.           while (!any(": \t\\\n}", c)) {
  1143. + #endif
  1144.           if (event != -1 && Isdigit(c))
  1145.               event = event * 10 + c - '0';
  1146.           else
  1147. ***************
  1148. *** 1603,1608 ****
  1149. --- 1640,1649 ----
  1150.       wfree();
  1151.       bfree();
  1152.   }
  1153. + #ifdef __MINT__
  1154. + #define ESPIPE EINVAL
  1155. + #endif
  1156.   
  1157.   void
  1158.   settell()
  1159. *** ./orig/sh.misc.c    Fri Oct 25 22:32:28 1991
  1160. --- ./sh.misc.c    Sat Nov 16 19:02:46 1991
  1161. ***************
  1162. *** 39,44 ****
  1163. --- 39,48 ----
  1164.   
  1165.   #include "sh.h"
  1166.   
  1167. + #ifdef __MINT__
  1168. + extern int __mint;    /* kernel version */
  1169. + #endif
  1170.   static    int    renum    __P((int, int));
  1171.   
  1172.   /*
  1173. ***************
  1174. *** 263,268 ****
  1175. --- 267,277 ----
  1176.   {
  1177.       register int f;
  1178.   
  1179. + #ifdef __MINT__
  1180. + /* in TOS, all handles are shared by all processes! (ack!) */
  1181. +     if (__mint == 0)
  1182. +     return;
  1183. + #endif
  1184.       if (didcch)
  1185.       return;
  1186.       didcch = 1;
  1187. ***************
  1188. *** 301,306 ****
  1189. --- 310,318 ----
  1190.       if (i == j || i < 0)
  1191.       return (i);
  1192.   #ifdef HAVEDUP2
  1193. + # ifdef __MINT__
  1194. +     if (__mint != 0)    /* TOS screws up dup2 */
  1195. + # endif
  1196.       if (j >= 0) {
  1197.       (void) dup2(i, j);
  1198.       if (j != i)
  1199. ***************
  1200. *** 321,326 ****
  1201. --- 333,343 ----
  1202.   
  1203.       if (i == j || i < 0 || j < 0 && i > 2)
  1204.       return (i);
  1205. + #ifdef __MINT__
  1206. +     if (__mint == 0 && j > 5) {
  1207. +     return (i <= 5) ? dup(i) : j;
  1208. +     }
  1209. + #endif
  1210.   #ifdef HAVEDUP2
  1211.       if (j >= 0) {
  1212.       (void) dup2(i, j);
  1213. ***************
  1214. *** 455,457 ****
  1215. --- 472,489 ----
  1216.           return (0);
  1217.       }
  1218.   }
  1219. + #ifdef __MINT__
  1220. + Char *
  1221. + Lastslash(pth)
  1222. +     Char *pth;
  1223. + {
  1224. +     Char *slash = 0, c;
  1225. +     while ( (c = *pth++) != 0) {
  1226. +         if (is_dirsep(c))
  1227. +             slash = pth - 1;
  1228. +     }
  1229. +     return slash;
  1230. + }
  1231. + #endif /* __MINT__ */
  1232. *** ./orig/sh.proc.c    Fri Oct 25 22:32:42 1991
  1233. --- ./sh.proc.c    Wed Nov 13 01:32:54 1991
  1234. ***************
  1235. *** 117,128 ****
  1236.                   0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L};
  1237.   
  1238.   # else /* !sun && !hp9000 */
  1239. ! #  ifdef masscomp
  1240.   /*
  1241.    * Initialization of this structure under RTU 4.1A & RTU 5.0 is problematic
  1242.    * because the first two elements are unions of a time_t and a struct timeval.
  1243.    * So we'll just have to trust the loader to do the "right thing", DAS DEC-90.
  1244.    */
  1245.   static struct rusage zru;
  1246.   #  else    /* masscomp */
  1247.   static struct rusage zru = {{0L, 0L}, {0L, 0L}, 0, 0, 0, 0, 0, 0, 0, 
  1248. --- 117,132 ----
  1249.                   0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L};
  1250.   
  1251.   # else /* !sun && !hp9000 */
  1252. ! #  if defined(masscomp) || defined(__MINT__)
  1253.   /*
  1254.    * Initialization of this structure under RTU 4.1A & RTU 5.0 is problematic
  1255.    * because the first two elements are unions of a time_t and a struct timeval.
  1256.    * So we'll just have to trust the loader to do the "right thing", DAS DEC-90.
  1257.    */
  1258. + /* MiNT is missing a lot of fields, so we also trust the loader (we can
  1259. +  * trust it) to avoid getting errors from the compiler
  1260. +  */
  1261.   static struct rusage zru;
  1262.   #  else    /* masscomp */
  1263.   static struct rusage zru = {{0L, 0L}, {0L, 0L}, 0, 0, 0, 0, 0, 0, 0, 
  1264. ***************
  1265. *** 153,158 ****
  1266. --- 157,180 ----
  1267.   static    struct process    *pgetcurr    __P((struct process *));
  1268.   static    void         okpcntl    __P((void));
  1269.   
  1270. + #ifdef __MINT__
  1271. + /*
  1272. +  * MiNT's fork() is a lot like vfork() in some respects; in particular,
  1273. +  * if we set job control signals to SIG_DFL after fork() and then
  1274. +  * get a signal, our parent will never be able to reclaim the address
  1275. +  * space and everything will hang :-(. Solution: rather than SIG_DFL,
  1276. +  * set the signals to a null signal handler; if we exec(), they will
  1277. +  * be set to SIG_DFL automatically, and before then the signals will
  1278. +  * effectively be ignored.
  1279. +  */
  1280. + void
  1281. + sig_tmp_ign(int sig)
  1282. + {
  1283. + /* do nothing, and rely on the magic of restartable system calls :-) */
  1284. + }
  1285. + #endif
  1286.   /*
  1287.    * pchild - called at interrupt level by the SIGCHLD signal
  1288.    *    indicating that at least one child has terminated or stopped
  1289. ***************
  1290. *** 1740,1748 ****
  1291. --- 1762,1777 ----
  1292.   #ifdef BSDJOBS
  1293.           if (wanttty >= 0) {
  1294.           /* make stoppable */
  1295. + # ifdef __MINT__
  1296. + /* see comments for sig_tmp_ign above */
  1297. +         (void) signal(SIGTSTP, sig_tmp_ign);
  1298. +         (void) signal(SIGTTIN, sig_tmp_ign);
  1299. +         (void) signal(SIGTTOU, sig_tmp_ign);
  1300. + # else
  1301.           (void) signal(SIGTSTP, SIG_DFL);
  1302.           (void) signal(SIGTTIN, SIG_DFL);
  1303.           (void) signal(SIGTTOU, SIG_DFL);
  1304. + # endif
  1305.           }
  1306.   #endif /* BSDJOBS */
  1307.           (void) signal(SIGTERM, parterm);
  1308. *** ./orig/sh.sem.c    Fri Oct 25 22:32:44 1991
  1309. --- ./sh.sem.c    Sun Nov 17 14:32:32 1991
  1310. ***************
  1311. *** 417,425 ****
  1312. --- 417,434 ----
  1313.               }
  1314.   
  1315.               if (wanttty >= 0) {
  1316. + #ifdef __MINT__
  1317. +             /* see sh.proc.c */
  1318. +                 extern void sig_tmp_ign();
  1319. +                 (void) signal(SIGTSTP, sig_tmp_ign);
  1320. +                 (void) signal(SIGTTIN, sig_tmp_ign);
  1321. +                 (void) signal(SIGTTOU, sig_tmp_ign);
  1322. + #else
  1323.                   (void) signal(SIGTSTP, SIG_DFL);
  1324.                   (void) signal(SIGTTIN, SIG_DFL);
  1325.                   (void) signal(SIGTTOU, SIG_DFL);
  1326. + #endif
  1327.               }
  1328.   
  1329.               (void) signal(SIGTERM, parterm);
  1330. ***************
  1331. *** 524,531 ****
  1332. --- 533,542 ----
  1333.       execute(t->t_dcar, wanttty, pipein, pv);
  1334.       t->t_dcdr->t_dflg |= F_PIPEIN | (t->t_dflg &
  1335.               (F_PIPEOUT | F_AMPERSAND | F_NOFORK | F_NOINTERRUPT));
  1336. + #ifndef __MINT__
  1337.       if (wanttty > 0)
  1338.           wanttty = 0;    /* got tty already */
  1339. + #endif
  1340.       execute(t->t_dcdr, wanttty, pv, pipeout);
  1341.       break;
  1342.   
  1343. ***************
  1344. *** 633,650 ****
  1345. --- 644,675 ----
  1346.           (void) dmove(fd, 0);
  1347.       }
  1348.       else if (flags & F_PIPEIN) {
  1349. + #ifdef __MINT__
  1350. +         (void) dup2(pipein[0], 0);
  1351. + #else
  1352.           (void) close(0);
  1353.           (void) dup(pipein[0]);
  1354. + #endif
  1355.           (void) close(pipein[0]);
  1356.           (void) close(pipein[1]);
  1357.       }
  1358.       else if ((flags & F_NOINTERRUPT) && tpgrp == -1) {
  1359. + #ifdef __MINT__
  1360. +         int fd = open(_PATH_DEVNULL, O_RDONLY);
  1361. +         (void)dup2(fd, 0);
  1362. +         (void)close(fd);
  1363. + #else
  1364.           (void) close(0);
  1365.           (void) open(_PATH_DEVNULL, O_RDONLY);
  1366. + #endif
  1367.       }
  1368.       else {
  1369. + #ifdef __MINT__
  1370. +         (void) dup2(OLDSTD, 0);
  1371. + #else
  1372.           (void) close(0);
  1373.           (void) dup(OLDSTD);
  1374. + #endif
  1375.   #ifdef FIOCLEX
  1376.   # ifdef CLEX_DUPS
  1377.           /*
  1378. ***************
  1379. *** 691,703 ****
  1380. --- 716,736 ----
  1381.       is1atty = isatty(1);
  1382.       }
  1383.       else if (flags & F_PIPEOUT) {
  1384. + #ifdef __MINT__
  1385. +     (void) dup2(pipeout[1], 1);
  1386. + #else
  1387.       (void) close(1);
  1388.       (void) dup(pipeout[1]);
  1389. + #endif
  1390.       is1atty = 0;
  1391.       }
  1392.       else {
  1393. + #ifdef __MINT__
  1394. +     (void) dup2(SHOUT, 1);
  1395. + #else
  1396.       (void) close(1);
  1397.       (void) dup(SHOUT);
  1398. + #endif
  1399.       is1atty = isoutatty;
  1400.   #ifdef FIOCLEX
  1401.   # ifdef CLEX_DUPS
  1402. ***************
  1403. *** 708,718 ****
  1404. --- 741,759 ----
  1405.   
  1406.       (void) close(2);
  1407.       if (flags & F_STDERR) {
  1408. + #ifdef __MINT__
  1409. +     (void) dup2(1, 2);
  1410. + #else
  1411.       (void) dup(1);
  1412. + #endif
  1413.       is2atty = is1atty;
  1414.       }
  1415.       else {
  1416. + #ifdef __MINT__
  1417. +     (void) dup2(SHDIAG, 2);
  1418. + #else
  1419.       (void) dup(SHDIAG);
  1420. + #endif
  1421.       is2atty = isdiagatty;
  1422.   #ifdef FIOCLEX
  1423.   # ifdef CLEX_DUPS
  1424. *** ./orig/sh.set.c    Fri Oct 25 22:32:48 1991
  1425. --- ./sh.set.c    Sun Nov 17 16:00:50 1991
  1426. ***************
  1427. *** 196,201 ****
  1428. --- 196,216 ----
  1429.       else if (eq(vp, STRwatch)) {
  1430.           resetwatch();
  1431.       }
  1432. + #ifdef ALTESC
  1433. +     else if (eq(vp, STRescchar)) {
  1434. +         register Char *cp;
  1435. +         cp = value(vp);
  1436. +         _cmap[escchar] &= ~_ESC;
  1437. +         escchar = (cp && *cp) ? *cp : '\001';
  1438. +         _cmap[escchar] |= _ESC;
  1439. +     }
  1440. + #endif
  1441. + #ifdef __MINT__
  1442. +     else if (eq(vp, STRdosslashes)) {
  1443. +         STRslash[0] = '\\';
  1444. +     }
  1445. + #endif
  1446.       } while (p = *v++);
  1447.   }
  1448.   
  1449. ***************
  1450. *** 577,582 ****
  1451. --- 592,608 ----
  1452.       editing = 0;
  1453.       if (adrof(STRbackslash_quote) == 0)
  1454.       bslash_quote = 0;
  1455. + #ifdef ALTESC
  1456. +     if (adrof(STRescchar) == 0) {
  1457. +     _cmap[escchar] &= ~_ESC;
  1458. +     escchar = '\\';
  1459. +     _cmap[escchar] |= _ESC;
  1460. +     }
  1461. + #endif
  1462. + #ifdef __MINT__
  1463. +     if (adrof(STRdosslashes) == 0)
  1464. +     STRslash[0] = '/';
  1465. + #endif
  1466.       if (did_only && adrof(STRrecognize_only_executables) == 0)
  1467.       tw_clear_comm_list();
  1468.   }
  1469. *** ./orig/sh.time.c    Fri Oct 25 22:32:50 1991
  1470. --- ./sh.time.c    Mon Nov 11 02:42:08 1991
  1471. ***************
  1472. *** 168,173 ****
  1473. --- 168,174 ----
  1474.   {
  1475.       tvadd(&ru->ru_utime, &ru2->ru_utime);
  1476.       tvadd(&ru->ru_stime, &ru2->ru_stime);
  1477. + #ifndef __MINT__
  1478.       if (ru2->ru_maxrss > ru->ru_maxrss)
  1479.       ru->ru_maxrss = ru2->ru_maxrss;
  1480.   
  1481. ***************
  1482. *** 184,189 ****
  1483. --- 185,191 ----
  1484.       ru->ru_nsignals += ru2->ru_nsignals;
  1485.       ru->ru_nvcsw += ru2->ru_nvcsw;
  1486.       ru->ru_nivcsw += ru2->ru_nivcsw;
  1487. + #endif /* __MINT__ */
  1488.   }
  1489.   
  1490.   #else                /* BSDTIMES */
  1491. ***************
  1492. *** 313,319 ****
  1493. --- 315,325 ----
  1494.       int     ms =
  1495.       (e->tv_sec - b->tv_sec) * 100 + (e->tv_usec - b->tv_usec) / 10000;
  1496.   
  1497. + # ifdef __MINT__
  1498. +     cp = "%Uu %Ss %E %P";
  1499. + # else
  1500.       cp = "%Uu %Ss %E %P %X+%Dk %I+%Oio %Fpf+%Ww";
  1501. + # endif
  1502.   #else
  1503.   # ifdef _SEQUENT_
  1504.       int     ms =
  1505. ***************
  1506. *** 404,410 ****
  1507.           xprintf("%ld.%01ld%%", i / 10, i % 10);    /* nn.n% */
  1508.           break;
  1509.   
  1510. ! #ifdef BSDTIMES
  1511.           case 'W':        /* number of swaps */
  1512.           i = r1->ru_nswap - r0->ru_nswap;
  1513.           xprintf("%ld", i);
  1514. --- 410,416 ----
  1515.           xprintf("%ld.%01ld%%", i / 10, i % 10);    /* nn.n% */
  1516.           break;
  1517.   
  1518. ! #if defined(BSDTIMES) && !defined(__MINT__)
  1519.           case 'W':        /* number of swaps */
  1520.           i = r1->ru_nswap - r0->ru_nswap;
  1521.           xprintf("%ld", i);
  1522. *** ./orig/sh.types.h    Fri Oct 25 22:34:36 1991
  1523. --- ./sh.types.h    Sat Nov  9 11:08:40 1991
  1524. ***************
  1525. *** 386,392 ****
  1526.   
  1527.   #endif /* ! POSIX */
  1528.   
  1529.   
  1530.   /***
  1531.    *** This is our own junk types.
  1532. --- 386,395 ----
  1533.   
  1534.   #endif /* ! POSIX */
  1535.   
  1536. ! #ifdef __MINT__
  1537. ! # define _SIGMASK_T
  1538. ! typedef long sigmask_t;
  1539. ! #endif
  1540.   
  1541.   /***
  1542.    *** This is our own junk types.
  1543. *** ./orig/tc.alloc.c    Fri Oct 25 22:34:02 1991
  1544. --- ./tc.alloc.c    Wed Nov 20 23:00:24 1991
  1545. ***************
  1546. *** 48,53 ****
  1547. --- 48,57 ----
  1548.   
  1549.   #include "sh.h"
  1550.   
  1551. + #ifdef __MINT__
  1552. + long _stksize = -128*1024L;
  1553. + #endif /* __MINT__ */
  1554.   char   *memtop = NULL;        /* PWP: top of current memory */
  1555.   char   *membot = NULL;        /* PWP: bottom of allocatable memory */
  1556.   
  1557. ***************
  1558. *** 239,248 ****
  1559. --- 243,255 ----
  1560.       memtop = (char *) op;
  1561.       if (membot == NULL)
  1562.       membot = memtop;
  1563. + #ifndef __MINT__
  1564.       if ((int) op & 0x3ff) {
  1565.       memtop = (char *) sbrk(1024 - ((int) op & 0x3ff));
  1566.       memtop += 1024 - ((int) op & 0x3ff);
  1567.       }
  1568. + #endif
  1569.   
  1570.       /* take 2k unless the block is bigger than that */
  1571.       rnu = (bucket <= 8) ? 11 : bucket + 3;
  1572. ***************
  1573. *** 288,294 ****
  1574.       return;
  1575.       CHECK(!memtop || !membot, "free(%lx) called before any allocations.", cp);
  1576.       CHECK(cp > (ptr_t) memtop, "free(%lx) above top of memory.", cp);
  1577. !     CHECK(cp < (ptr_t) membot, "free(%lx) above top of memory.", cp);
  1578.       op = (union overhead *) (((caddr_t) cp) - MEMALIGN(sizeof(union overhead)));
  1579.       CHECK(op->ov_magic != MAGIC, "free(%lx) bad block.", cp);
  1580.   
  1581. --- 295,301 ----
  1582.       return;
  1583.       CHECK(!memtop || !membot, "free(%lx) called before any allocations.", cp);
  1584.       CHECK(cp > (ptr_t) memtop, "free(%lx) above top of memory.", cp);
  1585. !     CHECK(cp < (ptr_t) membot, "free(%lx) below bottom of memory.", cp);
  1586.       op = (union overhead *) (((caddr_t) cp) - MEMALIGN(sizeof(union overhead)));
  1587.       CHECK(op->ov_magic != MAGIC, "free(%lx) bad block.", cp);
  1588.   
  1589. *** ./orig/tc.const.c    Fri Oct 25 22:34:08 1991
  1590. --- ./tc.const.c    Sun Nov 17 15:56:40 1991
  1591. ***************
  1592. *** 76,96 ****
  1593. --- 76,122 ----
  1594.   Char STRhistfile[]     = { 'h', 'i', 's', 't', 'f', 'i', 'l', 'e', '\0' };
  1595.   Char STRsource[]        = { 's', 'o', 'u', 'r', 'c', 'e', '\0' };
  1596.   Char STRmh[]            = { '-', 'h', '\0' };
  1597. + #ifndef __MINT__
  1598.   Char STRtildothist[]    = { '~', '/', '.', 'h', 'i', 's', 't', 'o', 'r', 
  1599.                       'y', '\0' };
  1600. + #else
  1601. + Char STRtildothist[]    = { '~', '/', 'h', 'i', 's', 't', 'o', 'r', 'y',
  1602. +                     '.', 'c', 's', 'h', '\0' };
  1603. + #endif
  1604.   
  1605.   #ifdef CSHDIRS
  1606. + # ifndef __MINT__
  1607.   Char STRdirfile[]     = { '~', '/', '.', 'c', 's', 'h', 'd', 'i', 'r',
  1608.                             's', '\0' };
  1609.   Char STRsldtdirs[]    = { '/', '.', 'c', 's', 'h', 'd', 'i', 'r', 's', '\0' };
  1610. + # else
  1611. + Char STRdirfile[]     = { '~', '/', 'c', 's', 'h', 'd', 'i', 'r', 's',
  1612. +                           '.', 'c', 's', 'h', '\0' };
  1613. + Char STRsldtdirs[]    = { '/', 'c', 's', 'h', 'd', 'i', 'r', 's', '.',
  1614. +               'c', 's', 'h', '\0' };
  1615. + # endif
  1616.   Char STRsavedirs[]    = { 's', 'a', 'v', 'e', 'd', 'i', 'r', 's', '\0' };
  1617.   #endif
  1618.   
  1619.   Char STRargv[]          = { 'a', 'r', 'g', 'v', '\0' };
  1620.   Char STRsavehist[]      = { 's', 'a', 'v', 'e', 'h', 'i', 's', 't', '\0' };
  1621. + #ifndef __MINT__
  1622.   Char STRsldthist[]      = { '/', '.', 'h', 'i', 's', 't', 'o', 'r', 'y', '\0' };
  1623. + #else
  1624. + Char STRsldthist[]      = { '/', 'h', 'i', 's', 't', 'o', 'r', 'y', '.',
  1625. +                 'c', 's', 'h', '\0' };
  1626. + #endif
  1627.   Char STRnormal[]        = { 'n', 'o', 'r', 'm', 'a', 'l', '\0' };
  1628. + #ifndef __MINT__
  1629.   Char STRsldtlogout[]    = { '/', '.', 'l', 'o', 'g', 'o', 'u', 't', '\0' };
  1630. + #else
  1631. + Char STRsldtlogout[]    = { '/', 'l', 'o', 'g', 'o', 'u', 't', '.', 'c', 's',
  1632. +                 'h', '\0' };
  1633. + #endif
  1634.   Char STRjobs[]          = { 'j', 'o', 'b', 's', '\0' };
  1635.   Char STRsymhash[]       = { '#', ' ', '\0' };
  1636.   Char STRsymarrow[]      = { '>', ' ', '\0' };
  1637. ***************
  1638. *** 183,191 ****
  1639. --- 209,224 ----
  1640.   Char STRmail[]        = { 'm', 'a', 'i', 'l', '\0' };
  1641.   Char STRwatch[]        = { 'w', 'a', 't', 'c', 'h', '\0' };
  1642.   
  1643. + #ifndef __MINT__
  1644.   Char STRsldottcshrc[]    = { '/', '.', 't', 'c', 's', 'h', 'r', 'c', '\0' };
  1645.   Char STRsldotcshrc[]    = { '/', '.', 'c', 's', 'h', 'r', 'c', '\0' };
  1646.   Char STRsldotlogin[]    = { '/', '.', 'l', 'o', 'g', 'i', 'n', '\0' };
  1647. + #else
  1648. + Char STRsldottcshrc[]    = { '/', 't', 'c', 's', 'h', '.', 'r', 'c', '\0' };
  1649. + Char STRsldotcshrc[]    = { '/', 'c', 's', 'h', '.', 'r', 'c', '\0' };
  1650. + Char STRsldotlogin[]    = { '/', 'l', 'o', 'g', 'i', 'n', '.', 'c', 's',
  1651. +                 'h','\0' };
  1652. + #endif
  1653.   Char STRignoreeof[]    = { 'i', 'g', 'n', 'o', 'r', 'e', 'e', 'o', 'f', '\0' };
  1654.   Char STRnoclobber[]    = { 'n', 'o', 'c', 'l', 'o', 'b', 'b', 'e', 'r', '\0' };
  1655.   Char STRhelpcommand[]    = { 'h', 'e', 'l', 'p', 'c', 'o', 'm', 'm', 'a', 'n', 
  1656. ***************
  1657. *** 254,256 ****
  1658. --- 287,298 ----
  1659.   Char STRsys53[] = { 's', 'y', 's', '5', '.', '3', '\0' };
  1660.   Char STRver[] = { 'v', 'e', 'r', '\0' };
  1661.   #endif /* apollo */
  1662. + #ifdef ALTESC
  1663. + Char STRescchar[] = { 'e', 's', 'c', 'c', 'h', 'a', 'r', '\0' };
  1664. + #endif
  1665. + #ifdef __MINT__
  1666. + Char STRdosslashes[] = { 'd', 'o', 's', 's', 'l', 'a', 's', 'h', 'e', 's',
  1667. +             '\0' };
  1668. + #endif
  1669. *** ./orig/tc.os.c    Fri Oct 25 22:34:20 1991
  1670. --- ./tc.os.c    Sat Nov  9 21:59:52 1991
  1671. ***************
  1672. *** 687,693 ****
  1673. --- 687,695 ----
  1674.   {
  1675.       extern ptr_t membot;
  1676.   
  1677. + #ifndef __MINT__
  1678.       membot = (char *) sbrk(0);
  1679. + #endif
  1680.   
  1681.   #ifdef OREO
  1682.       set42sig();
  1683. *** ./orig/tc.os.h    Fri Oct 25 22:34:24 1991
  1684. --- ./tc.os.h    Sun Nov 10 17:38:20 1991
  1685. ***************
  1686. *** 318,323 ****
  1687. --- 318,324 ----
  1688.   extern int atoi();
  1689.   extern char *ttyname();
  1690.   
  1691. + #ifndef __MINT__
  1692.   # ifndef hpux
  1693.   extern int abort();
  1694.   extern int qsort();
  1695. ***************
  1696. *** 325,330 ****
  1697. --- 326,332 ----
  1698.   extern void abort();
  1699.   extern void qsort();
  1700.   # endif
  1701. + #endif /* __MINT__ */
  1702.   extern void perror();
  1703.   
  1704.   #ifndef NEEDgethostname
  1705. *** ./orig/tc.sig.c    Fri Oct 25 22:34:32 1991
  1706. --- ./tc.sig.c    Sat Nov  9 10:53:10 1991
  1707. ***************
  1708. *** 403,405 ****
  1709. --- 403,425 ----
  1710.       Synch_Cnt++;
  1711.   }
  1712.   #endif /* SIGSYNCH */
  1713. + #ifdef __MINT__
  1714. + /* MiNT has most BSD signal things, but not sigvec; punt */
  1715. + void
  1716. + mysigvec(sig, new, old)
  1717. +     int sig;
  1718. +     sigvec_t *new, *old;
  1719. + {
  1720. +     void (*oldhandler)();
  1721. +     if (new) {
  1722. +         oldhandler = signal(sig, new->sv_handler);
  1723. +     } else {
  1724. +         oldhandler = signal(sig, SIG_IGN);
  1725. +         signal(sig, oldhandler);
  1726. +     }
  1727. +     if (old)
  1728. +         old->sv_handler = oldhandler;
  1729. + }
  1730. + #endif /* __MINT__ */
  1731. *** ./orig/tc.sig.h    Fri Oct 25 22:34:32 1991
  1732. --- ./tc.sig.h    Sat Nov  9 11:20:02 1991
  1733. ***************
  1734. *** 62,67 ****
  1735. --- 62,75 ----
  1736.   #  define sv_handler sa_handler
  1737.   # endif    /* _SEQUENT */
  1738.   
  1739. + # ifdef __MINT__
  1740. + #  define HAVE_SIGVEC
  1741. + typedef struct sigvec {
  1742. +     sigret_t (*sv_handler)();
  1743. + } sigvec_t;
  1744. + extern void mysigvec(int, sigvec_t *, sigvec_t *);
  1745. + #endif /* __MINT__ */
  1746.   # ifdef hpux
  1747.   #  define HAVE_SIGVEC
  1748.   #  define mysigvec(a, b, c)    sigvector(a, b, c)
  1749. ***************
  1750. *** 101,110 ****
  1751. --- 109,120 ----
  1752.   /*
  1753.    * For 4.2bsd signals.
  1754.    */
  1755. + #ifndef __MINT__
  1756.   # ifdef sigmask
  1757.   #  undef sigmask
  1758.   # endif                /* sigmask */
  1759.   # define    sigmask(s)    (1 << ((s)-1))
  1760. + #endif /* __MINT__ */
  1761.   # ifdef _SEQUENT_
  1762.   #  define     sigpause(a)    bsd_sigpause(a)
  1763.   #  define     signal(a, b)    sigset(a, b)
  1764. *** ./orig/tc.vers.c    Fri Oct 25 22:34:38 1991
  1765. --- ./tc.vers.c    Sun Nov 10 02:19:00 1991
  1766. ***************
  1767. *** 348,353 ****
  1768. --- 348,357 ----
  1769.       hosttype = str2short("amdahl");
  1770.   #endif /* uts */
  1771.     
  1772. + # ifdef atarist
  1773. + #  define _havehosttype_
  1774. +     hosttype = str2short("atarist");
  1775. + # endif
  1776.   
  1777.   # ifndef _havehosttype_
  1778.   #  define _havehosttype_
  1779. *** ./orig/tw.parse.c    Fri Oct 25 22:33:16 1991
  1780. --- ./tw.parse.c    Thu Nov 21 09:32:44 1991
  1781. ***************
  1782. *** 45,50 ****
  1783. --- 45,54 ----
  1784.   #include "ed.h"
  1785.   #include "tc.h"
  1786.   
  1787. + #ifdef __MINT__
  1788. + extern Char *Lastslash();
  1789. + #endif
  1790.   /* #define TENEDEBUG */
  1791.   
  1792.   /* true if the path has relative elements */
  1793. ***************
  1794. *** 127,136 ****
  1795.        */
  1796.       for (cmd_st = str_end; cmd_st > inputline; --cmd_st)
  1797.       if (iscmdmeta(cmd_st[-1])
  1798. !         && ((cmd_st - 1 == inputline) || (cmd_st[-2] != '\\')))
  1799.           break;
  1800.       /* step forward over leading spaces */
  1801.       while (*cmd_st != '\0' && (*cmd_st == ' ' || *cmd_st == '\t'))
  1802.       cmd_st++;
  1803.   
  1804.       /*
  1805. --- 131,144 ----
  1806.        */
  1807.       for (cmd_st = str_end; cmd_st > inputline; --cmd_st)
  1808.       if (iscmdmeta(cmd_st[-1])
  1809. !         && ((cmd_st - 1 == inputline) || (cmd_st[-2] != escchar)))
  1810.           break;
  1811.       /* step forward over leading spaces */
  1812. + #ifdef __MINT__
  1813. +     while (*cmd_st && (*cmd_st == ' ' || *cmd_st == '\t' || *cmd_st == '\r'))
  1814. + #else
  1815.       while (*cmd_st != '\0' && (*cmd_st == ' ' || *cmd_st == '\t'))
  1816. + #endif
  1817.       cmd_st++;
  1818.   
  1819.       /*
  1820. ***************
  1821. *** 140,146 ****
  1822.       for (word_start = str_end; word_start > inputline; --word_start) {
  1823.       if ((ismeta(word_start[-1]) || isaset(cmd_st, word_start)) &&
  1824.           (word_start[-1] != '#') && (word_start[-1] != '$') &&
  1825. !         ((word_start - 1 == inputline) || (word_start[-2] != '\\')))
  1826.           break;
  1827.       }
  1828.   
  1829. --- 148,154 ----
  1830.       for (word_start = str_end; word_start > inputline; --word_start) {
  1831.       if ((ismeta(word_start[-1]) || isaset(cmd_st, word_start)) &&
  1832.           (word_start[-1] != '#') && (word_start[-1] != '$') &&
  1833. !         ((word_start - 1 == inputline) || (word_start[-2] != escchar)))
  1834.           break;
  1835.       }
  1836.   
  1837. ***************
  1838. *** 209,214 ****
  1839. --- 217,223 ----
  1840.            */
  1841.           *wp++ = *cmd_start;
  1842.           break;
  1843. + #ifndef ALTESC
  1844.       case '\\':
  1845.           if (in_single || in_double)
  1846.           *wp++ = *cmd_start | QUOTE;
  1847. ***************
  1848. *** 215,221 ****
  1849. --- 224,244 ----
  1850.           else
  1851.           *wp++ = *++cmd_start | QUOTE;
  1852.           break;
  1853. + #endif
  1854.       default:
  1855. + #ifdef ALTESC
  1856. +         if (*cmd_start == escchar) {
  1857. +         if (in_single || in_double)
  1858. +             *wp++ = *cmd_start | QUOTE;
  1859. +         else
  1860. +             *wp++ = *++cmd_start | QUOTE;
  1861. +         } else
  1862. + # ifdef __MINT__
  1863. +         if (*cmd_start == '\\')
  1864. +             *wp++ = *cmd_start;
  1865. +         else
  1866. + # endif
  1867. + #endif
  1868.           *wp++ = *cmd_start | in_single;
  1869.           break;
  1870.       }
  1871. ***************
  1872. *** 240,246 ****
  1873. --- 263,273 ----
  1874.   
  1875.       case RECOGNIZE:
  1876.       if (adrof(STRautocorrect)) {
  1877. + #ifdef __MINT__
  1878. +         if ((slshp = Lastslash(word)) != NULL && slshp[1] != '\0') {
  1879. + #else
  1880.           if ((slshp = Strrchr(word, '/')) != NULL && slshp[1] != '\0') {
  1881. + #endif
  1882.           SearchNoDirErr = 1;
  1883.           for (bptr = word; bptr < slshp; bptr++) {
  1884.               /*
  1885. ***************
  1886. *** 406,412 ****
  1887.       if ((cmap(*wptr, _META | _DOL | _Q | _ESC | _GLOB) || *wptr == HIST ||
  1888.            *wptr == HISTSUB) &&
  1889.           (*wptr != ' ' || !trail_space || *(wptr + 1) != '\0'))
  1890. !         *bptr++ = '\\';
  1891.       *bptr++ = *wptr++;
  1892.       }
  1893.       *bptr = '\0';
  1894. --- 433,439 ----
  1895.       if ((cmap(*wptr, _META | _DOL | _Q | _ESC | _GLOB) || *wptr == HIST ||
  1896.            *wptr == HISTSUB) &&
  1897.           (*wptr != ' ' || !trail_space || *(wptr + 1) != '\0'))
  1898. !         *bptr++ = escchar;
  1899.       *bptr++ = *wptr++;
  1900.       }
  1901.       *bptr = '\0';
  1902. ***************
  1903. *** 635,645 ****
  1904. --- 662,680 ----
  1905.       non_unique_match = FALSE;    /* See the recexact code below */
  1906.   
  1907.       extract_dir_and_name(word, dir, name);
  1908. + #ifdef __MINT__
  1909. +     looking_for_lognames = (*word == '~') && (Lastslash(word) == NULL);
  1910. +     looking_for_shellvar = (target = Strrchr(name, '$')) &&
  1911. +     (Lastslash(name) == NULL);
  1912. +     looking_for_file = (!looking_for_command && !looking_for_lognames &&
  1913. +             !looking_for_shellvar) || Lastslash(word);
  1914. + #else
  1915.       looking_for_lognames = (*word == '~') && (Strchr(word, '/') == NULL);
  1916.       looking_for_shellvar = (target = Strrchr(name, '$')) &&
  1917.       (Strchr(name, '/') == NULL);
  1918.       looking_for_file = (!looking_for_command && !looking_for_lognames &&
  1919.               !looking_for_shellvar) || Strchr(word, '/');
  1920. + #endif
  1921.   
  1922.       /* PWP: don't even bother when doing ALL of the commands */
  1923.       if (looking_for_command && (*word == '\0')) 
  1924. ***************
  1925. *** 675,681 ****
  1926.       if (nd) {
  1927.           if (*tilded_dir != '\0') {
  1928.           Char   *s, *d, *p;
  1929.           /*
  1930.            * Copy and append a / if there was one
  1931.            */
  1932. --- 710,735 ----
  1933.       if (nd) {
  1934.           if (*tilded_dir != '\0') {
  1935.           Char   *s, *d, *p;
  1936. ! #ifdef __MINT__
  1937. !         Char slashc = '/';
  1938. !         /*
  1939. !          * Copy and append a / if there was one
  1940. !          */
  1941. !         for (p = tilded_dir; *p; p++);
  1942. !         --p;
  1943. !         if (is_dirsep(*p)) {
  1944. !             slashc = *p;
  1945. !             for (p = nd; *p; p++);
  1946. !             --p;
  1947. !             if (!is_dirsep(*p))
  1948. !             p = NULL;
  1949. !         }
  1950. !         for (d = tilded_dir, s = nd; *d++ = *s++;);
  1951. !         if (!p) {
  1952. !             *d-- = '\0';
  1953. !             *d = slashc;
  1954. !         }
  1955. ! #else
  1956.           /*
  1957.            * Copy and append a / if there was one
  1958.            */
  1959. ***************
  1960. *** 690,695 ****
  1961. --- 744,750 ----
  1962.               *d-- = '\0';
  1963.               *d = '/';
  1964.           }
  1965. + #endif
  1966.           }
  1967.           xfree((ptr_t) nd);
  1968.       }
  1969. ***************
  1970. *** 771,778 ****
  1971. --- 826,838 ----
  1972.               if (dir_fd != NULL)
  1973.               FREE_DIR(dir_fd);
  1974.               entry = NULL;
  1975. + #ifdef __MINT__
  1976. +             while (*pathv && (pathv[0][0] == '/' || pathv[0][0] == '\\'))
  1977. +             pathv++;
  1978. + #else
  1979.               while (*pathv && pathv[0][0] == '/')
  1980.               pathv++;
  1981. + #endif
  1982.               if (*pathv) {
  1983.               /*
  1984.                * We complete directories only on '.' should that
  1985. ***************
  1986. *** 1108,1114 ****
  1987. --- 1168,1178 ----
  1988.   {
  1989.       register Char *p;
  1990.   
  1991. + #ifdef __MINT__
  1992. +     p = Lastslash(path);
  1993. + #else
  1994.       p = Strrchr(path, '/');
  1995. + #endif
  1996.       if (p == NULL) {
  1997.       copyn(name, path, MAXNAMLEN);
  1998.       dir[0] = '\0';
  1999. ***************
  2000. *** 1235,1241 ****
  2001. --- 1299,1309 ----
  2002.       }
  2003.   
  2004.       new[0] = '\0';
  2005. + #ifdef __MINT__
  2006. +     for (p = new, o = &old[1]; *o && !is_dirsep(*o); *p++ = *o++);
  2007. + #else
  2008.       for (p = new, o = &old[1]; *o && *o != '/'; *p++ = *o++);
  2009. + #endif
  2010.       *p = '\0';
  2011.   
  2012.       if (old[0] == '~') {
  2013. ***************
  2014. *** 1306,1311 ****
  2015. --- 1374,1384 ----
  2016.           if (S_ISBLK(statb.st_mode))    /* block device */
  2017.           return ('#');
  2018.           if (S_ISDIR(statb.st_mode))    /* normal Directory */
  2019. + #ifdef __MINT__
  2020. +         if (is_set(STRdosslashes))
  2021. +             return ('\\');
  2022. +         else
  2023. + #endif
  2024.           return ('/');
  2025.           if (statb.st_mode & 0111)
  2026.           return ('*');
  2027. ***************
  2028. *** 1483,1489 ****
  2029. --- 1556,1566 ----
  2030.   
  2031.       if (adrof(STRrecognize_only_executables)) {
  2032.       for (pv = v->vec; *pv; pv++) {
  2033. + #ifdef __MINT__
  2034. +         if (pv[0][0] != '/' && pv[0][0] != '\\') {
  2035. + #else
  2036.           if (pv[0][0] != '/') {
  2037. + #endif
  2038.           relatives_in_path = 1;
  2039.           continue;
  2040.           }
  2041. ***************
  2042. *** 1504,1510 ****
  2043. --- 1581,1591 ----
  2044.       }
  2045.       else {
  2046.       for (pv = v->vec; *pv; pv++) {
  2047. + #ifdef __MINT__
  2048. +         if (pv[0][0] != '/' && pv[0][0] != '\\') {
  2049. + #else
  2050.           if (pv[0][0] != '/') {
  2051. + #endif
  2052.           relatives_in_path = 1;
  2053.           continue;
  2054.           }
  2055. *** ./orig/tw.spell.c    Fri Oct 25 22:33:18 1991
  2056. --- ./tw.spell.c    Sun Nov 17 15:12:40 1991
  2057. ***************
  2058. *** 40,45 ****
  2059. --- 40,49 ----
  2060.   #include "sh.h"
  2061.   #include "tw.h"
  2062.   
  2063. + #ifdef __MINT__
  2064. + extern Char *Lastslash();
  2065. + #endif
  2066.   extern Char **command_list;
  2067.   extern int numcommands;
  2068.   
  2069. ***************
  2070. *** 56,63 ****
  2071. --- 60,78 ----
  2072.       bool    foundslash = 0;
  2073.       int     retval;
  2074.   
  2075. + #ifdef __MINT__
  2076. +     /* skip drive specification, if any */
  2077. +     if (*old && old[1] == ':' && is_dirsep(old[2])) {
  2078. +     *new++ = *old++; *new++ = *old++;
  2079. +     }
  2080. + #endif
  2081.       for (;;) {
  2082. + #ifdef __MINT__
  2083. +     while (is_dirsep(*old)) {
  2084. + #else
  2085.       while (*old == '/') {    /* skip '/' */
  2086. + #endif
  2087.           *new++ = *old++;
  2088.           foundslash = 1;
  2089.       }
  2090. ***************
  2091. *** 76,82 ****
  2092. --- 91,101 ----
  2093.           if (p < guess + FILSIZ)
  2094.               *p++ = *cp;
  2095.       ws = p;
  2096. + #ifdef __MINT__
  2097. +     for (; !is_dirsep(*old) && *old != '\0'; old++)
  2098. + #else
  2099.       for (; *old != '/' && *old != '\0'; old++)/* add current file name */
  2100. + #endif
  2101.           if (p < guess + FILSIZ)
  2102.           *p++ = *old;
  2103.       *p = '\0';        /* terminate it */
  2104. ***************
  2105. *** 86,93 ****
  2106. --- 105,117 ----
  2107.        * far but there are later - or it will look for *all* commands
  2108.        */
  2109.       /* (*should* say "looking for directory" whenever '/' is next...) */
  2110. + #ifdef __MINT__
  2111. +     retval = t_search(guess, p, SPELL, FILSIZ,
  2112. +       looking_for_cmd && (foundslash || !is_dirsep(*old)), 1);
  2113. + #else
  2114.       retval = t_search(guess, p, SPELL, FILSIZ,
  2115.                 looking_for_cmd && (foundslash || *old != '/'), 1);
  2116. + #endif
  2117.       if (retval >= 4 || retval < 0)
  2118.           return -1;        /* hopeless */
  2119.       for (p = ws; *new = *p++;)
  2120.